Как выполнить поиск и замену текста в файле с помощью Python 3?
Вот мой код:
import os import sys import fileinput
print("Text to search for:") textToSearch = input("> ")
print("Text to replace it with:") textToReplace = input("> ")
print("File to perform Search-Replace on:") fileToSearch = input("> ")
tempFile = open(fileToSearch, 'r+')
for line in fileinput.input(fileToSearch): if textToSearch in line: print('Match Found') else: print('Match Not Found!!') tempFile.write(line.replace(textToSearch, textToReplace)) tempFile.close()
input('\n\n Press Enter to exit...')
Входной файл:
hi this is abcd hi this is abcd This is dummy text file. This is how search and replace works abcd
Когда я ищу и заменяю 'ram' на 'abcd' во входном файле выше, это работает как по волшебству. Но когда я делаю это наоборот, т. Е. Заменяю 'abcd' на 'ram', в конце остаются некоторые ненужные символы.
Замена 'abcd' на 'ram':
hi this is ram hi this is ram This is dummy text file. This is how search and replace works rambcd
Переведено автоматически
Ответ 1
Как указал michaelb958, вы не можете заменить на месте данными другой длины, потому что это поставит остальные разделы не на свои места. Я не согласен с другими плакатами, предлагающими читать из одного файла и записывать в другой. Вместо этого я бы прочитал файл в память, исправил данные, а затем записал их в тот же файл отдельным шагом.
# Read in the file withopen('file.txt', 'r') as file: filedata = file.read()
# Replace the target string filedata = filedata.replace('abcd', 'ram')
# Write the file out again withopen('file.txt', 'w') as file: file.write(filedata)
Если только у вас нет большого файла для работы, который слишком велик, чтобы загрузить его в память за один раз, или вы обеспокоены потенциальной потерей данных, если процесс будет прерван на втором этапе, на котором вы записываете данные в файл.
Ответ 2
fileinput уже поддерживает редактирование на месте. В данном случае оно перенаправляет stdout на файл:
#!/usr/bin/env python3 import fileinput
with fileinput.FileInput(filename, inplace=True, backup='.bak') as file: for line in file: print(line.replace(text_to_search, replacement_text), end='')