Как мне искать и заменять текст в файле, используя 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( "> " )
#fileToSearch = 'D:\dummy1.txt'
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
Ответы:
fileinput
уже поддерживает редактирование на месте. Он перенаправляетstdout
в файл в этом случае:источник
end=''
аргумент предполагается сделать?line
уже есть новая строка.end
является новой строкой по умолчанию,end=''
заставляетprint()
функцию не печатать дополнительную новуюfileinput
не является инструментом для всех рабочих мест ( ничего не есть) , но есть много случаев , когда это является правильным инструментом , например, реализоватьsed
-like фильтр в Python. Не используйте отвертку, чтобы растереть гвозди.fileinput
делает (в основном, используйтеtry..finally
или contextmanager, чтобы гарантировать, что впоследствии вы вернете stdout к его первоначальному значению). Исходный кодfileinput
довольно устрашающе ужасен, и он делает некоторые действительно небезопасные вещи под капотом. Если бы он был написан сегодня, я очень сомневаюсь, что он превратился бы в stdlib.Как указал michaelb958, вы не можете заменить на месте данные другой длины, потому что это приведет к тому, что остальные разделы окажутся не на своем месте. Я не согласен с другими плакатами, предлагающими вам читать из одного файла и писать в другой. Вместо этого я считывал файл в память, исправлял данные и затем записывал их в тот же файл на отдельном этапе.
Если у вас нет большого файла для работы, который слишком велик для загрузки в память за один раз, или вы обеспокоены потенциальной потерей данных, если процесс прервется во время второго шага, на котором вы записываете данные в файл.
источник
with file = open(..):
не является допустимым Python (=
), хотя намерение ясно..replace()
не изменяет строку (она неизменна), поэтому вам нужно использовать возвращаемое значение. В любом случае код, который поддерживает большие файлы, может быть еще проще, если вам не нужно искать и заменять текст, занимающий несколько строк.with
Оператор автоматически закрывает файл в конце блока операторов.Как писал Джек Эйдли и JF Себастьян, этот код не будет работать:
Но этот код будет работать (я проверял это):
Используя этот метод, filein и fileout могут быть одним и тем же файлом, потому что Python 3.3 перезапишет файл при открытии для записи.
источник
with
заявление? 2. Как указано в моем ответе,fileinput
может работать на месте - он может заменить данные в одном файле (он использует временный файл для внутреннего использования). Разница в том, чтоfileinput
не требуется загружать весь файл в память.with
блоков).Вы можете сделать замену, как это
источник
Вы также можете использовать
pathlib
.источник
С одним блоком вы можете искать и заменять текст:
источник
seek
в начале файла, прежде чем писать его.truncate
не делает этого, и поэтому у вас будет мусор в файле.Ваша проблема связана с чтением и записью в один и тот же файл. Вместо того, чтобы открывать
fileToSearch
для записи, откройте фактический временный файл, а затем, когда вы закончите и закроетеtempFile
, используйте,os.rename
чтобы переместить новый файлfileToSearch
.источник
(pip install python-util)
Второй параметр (то, что нужно заменить, например, «abcd» также может быть регулярным выражением),
заменит все вхождения
источник
Мой вариант, одно слово за раз на весь файл.
Я прочитал это в память.
источник
Я сделал это:
источник
fileinput
не работаюinplace=True
сutf-8
.Я слегка изменил пост Джейрама Сингха, чтобы заменить каждый экземпляр '!' символ числа, которое я хотел увеличить с каждым экземпляром. Подумал, что это может быть полезно для того, кто хочет изменить символ, который встречается более одного раза в строке и хочет выполнить итерацию. Надеюсь, что это помогает кому-то. PS - Я очень новичок в кодировании, поэтому извиняюсь, если мой пост неуместен каким-либо образом, но это сработало для меня.
источник
источник
Вот так:
источник
источник