Как перебрать массив и заменить в нем текст?

Рейтинг: 1Ответов: 2Опубликовано: 19.09.2014

Добрый день.
Пытаюсь освоить Python. Вопрос: как заменить в строке совпадения?
У меня все время ошибка :(

def create_config(file, array , outfile):
    if os.path.isfile(file):
        f = open(file)
        o = open(outfile,'a')
        while 1:
            line = f.readline()
            if not line: break

            for key, value in array.items():
                line = line.replace(key, value)

            o.write(line)
        o.close()
    else:
        print('mongodb.conf does not exist')
h1 = {'dbpath':'= /opt/mongo', 'logpath':"= /mongo/zzz", 3:"three"}

create_config('1', h1 , '22')

Traceback (most recent call last): File "test.py", line 30, in <module> line2 = line.replace(key, value) TypeError: expected a character buffer object

Ответы

▲ 1

Подозреваю, что ругается на ключ 3. Попробуйте приводить тип:

line = line.replace(str(key), str(value))

int на это должен отреагировать вполне спокойно.

▲ 0

В Питоне строки и числа принадлежат к разным типам. line.replace принимает только строки.

Питон 3 использует более информативное сообщение об ошибке:

>>> ''.replace(3, '')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly

Если h1 словарь используется только в create_config() функции, тогда можно изменить его определение, чтобы он не содержал не строковых значений:

h1 = {'dbpath': '= /opt/mongo', 'logpath': '= /mongo/zzz', '3':' three'}

В слепую str() лучше не вызывать, это может скрыть баги, такие как смешивание юникодных и бинарных строк, -- на ascii-вводе такая программа будет работать, но сломается в общем случае.