Замена текста в файле с помощью 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, это тоже не идеальное решение. Я хотел бы знать, что это лучший способ сделать это. Спасибо заранее!
Ответы
Ответ 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