Подтвердить что ты не робот

Замена текста в файле с помощью Python

Я новичок в Python. Я хочу иметь возможность открывать файл и заменять каждый экземпляр определенных слов данной заменой через Python. например, замените каждое слово "ноль" на "0", "temp" на "bob" и произнесите "мусор" с "ничего".

Сначала я начал использовать это:

for line in fileinput.input(fin):
        fout.write(line.replace('zero', '0'))
        fout.write(line.replace('temp','bob'))
        fout.write(line.replace('garbage','nothing'))

но я не думаю, что это даже отдаленно правильный способ сделать это. Затем я подумал о том, что делать, если инструкции проверять, содержит ли строка эти элементы, и если да, то замените ту, которую содержит строка, но из того, что я знаю о Python, это тоже не идеальное решение. Я хотел бы знать, что это лучший способ сделать это. Спасибо заранее!

4b9b3361

Ответ 1

Это должно сделать это

replacements = {'zero':'0', 'temp':'bob', 'garbage':'nothing'}

with open('path/to/input/file') as infile, open('path/to/output/file', 'w') as outfile:
    for line in infile:
        for src, target in replacements.iteritems():
            line = line.replace(src, target)
        outfile.write(line)

РЕДАКТИРОВАТЬ. Чтобы адресовать комментарий Eildosa, если вы хотите сделать это, не пиши в другой файл, тогда вы получите для чтения всего исходного файла в память:

lines = []
with open('path/to/input/file') as infile:
    for line in infile:
        for src, target in replacements.iteritems():
            line = line.replace(src, target)
        lines.append(line)
with open('path/to/input/file', 'w') as outfile:
    for line in lines:
        outfile.write(line)

Изменить: Если вы используете Python 3.x, используйте replacements.items() вместо replacements.iteritems()

Ответ 2

Я мог бы рассмотреть использование dict и re.sub для чего-то вроде этого:

import re
repldict = {'zero':'0', 'one':'1' ,'temp':'bob','garage':'nothing'}
def replfunc(match):
    return repldict[match.group(0)]

regex = re.compile('|'.join(re.escape(x) for x in repldict))
with open('file.txt') as fin, open('fout.txt','w') as fout:
    for line in fin:
        fout.write(regex.sub(replfunc,line))

Это имеет небольшое преимущество для replace в том, что он немного более устойчив к совпадению совпадений.

Ответ 3

Если ваш файл короткий (или даже не очень длинный), вы можете использовать следующий фрагмент для замены текста:

# Replace variables in file
with open('path/to/in-out-file', 'r+') as f:
    content = f.read()
    f.seek(0)
    f.truncate()
    f.write(content.replace('replace this', 'with this'))

Ответ 4

Существенным способом является

  • read(),
  • data = data.replace() так часто, как вам нужно, а затем
  • write().

Если вы читаете и записываете все данные сразу или в меньших частях, зависит от вас. Вы должны зависеть от ожидаемого размера файла.

read() можно заменить итерацией по файловому объекту.

Ответ 5

Более быстрый способ записи будет...

in = open('path/to/input/file').read()
out = open('path/to/input/file', 'w')
replacements = {'zero':'0', 'temp':'bob', 'garbage':'nothing'}
for i in replacements.keys():
    in = in.replace(i, replacements[i])
out.write(in)
out.close

Это устранило много итераций, которые предлагают другие ответы, и ускорит процесс для более длинных файлов.

Ответ 6

Чтение со стандартного ввода, напишите 'code.py' следующим образом:

import sys

rep = {'zero':'0', 'temp':'bob', 'garbage':'nothing'}

for line in sys.stdin:
    for k, v in rep.iteritems():
        line = line.replace(k, v)
    print line

Затем выполните script с перенаправлением или трубопроводом (http://en.wikipedia.org/wiki/Redirection_ (вычисления))

python code.py < infile > outfile

Ответ 7

Это короткий и простой пример, который я использовал:

Если:

fp = open("file.txt", "w")

Тогда:

fp.write(line.replace('is', 'now'))
// "This is me" becomes "This now me"

Не:

line.replace('is', 'now')
fp.write(line)
// "This is me" not changed while writing