Как искать и заменять текст в файле с помощью Python?
Как найти и заменить текст в файл с помощью 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( 'nn Press Enter to exit...' )
входной файл:
привет это abcd привет это abcd
это фиктивный текстовый файл.
вот как работает поиск и замена abcd
когда я ищу и заменяю " ram " на "abcd" в вышеуказанном входном файле, он работает как шарм. Но когда я делаю это наоборот, т. е. заменяю "abcd" на "ram", какой-то мусор символы остаются в конце.
замена 'abcd' на 'ram'
привет это рам привет это рам
это фиктивный текстовый файл.
вот как работает поиск и замена rambcd
14 ответов:
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='')
как указал michaelb958, вы не можете заменить на месте с данными другой длины, потому что это поставит остальные разделы не на месте. Я не согласен с другими плакатами, предлагаю вам читать из одного файла и писать в другой. Вместо этого я бы прочитал файл в память, исправил данные, а затем записал его в тот же файл на отдельном шаге.
# Read in the file with open('file.txt', 'r') as file : filedata = file.read() # Replace the target string filedata = filedata.replace('ram', 'abcd') # Write the file out again with open('file.txt', 'w') as file: file.write(filedata)Если у вас нет массивного файла для работы с которым слишком большой, чтобы загрузить в память в одном идти.
Как написал Джек Эйдли и указал Дж. Ф. Себастьян, этот код не будет работать:
# Read in the file filedata = None with file = open('file.txt', 'r') : filedata = file.read() # Replace the target string filedata.replace('ram', 'abcd') # Write the file out again with file = open('file.txt', 'w') : file.write(filedata)`но этот код будет работать (я проверял):
f = open(filein,'r') filedata = f.read() f.close() newdata = filedata.replace("old data","new data") f = open(fileout,'w') f.write(newdata) f.close()используя этот метод, filein и fileout могут быть одним и тем же файлом, потому что Python 3.3 перезапишет файл при открытии для записи.
вы можете сделать замену, как это
f1 = open('file1.txt', 'r') f2 = open('file2.txt', 'w') for line in f1: f2.write(line.replace('old_text', 'new_text')) f1.close() f2.close()
ваша проблема связана с чтением и записью в один и тот же файл. Вместо того, чтобы открыть
fileToSearchдля записи откройте фактический временный файл, а затем после того, как вы закончите и закроетеtempFileиспользуйтеos.rename, чтобы переместить новый файлfileToSearch.
мой вариант, по одному слову за раз на весь файл.
Я прочитал его в памяти.
def replace_word(infile,old_word,new_word): if not os.path.isfile(infile): print ("Error on replace_word, not a regular file: "+infile) sys.exit(1) f1=open(infile,'r').read() f2=open(infile,'w') m=f1.replace(old_word,new_word) f2.write(m)
Я сделал так:
#!/usr/bin/env python3 import fileinput import os Dir = input ("Source directory: ") os.chdir(Dir) Filelist = os.listdir() print('File list: ',Filelist) NomeFile = input ("Insert file name: ") CarOr = input ("Text to search: ") CarNew = input ("New text: ") with fileinput.FileInput(NomeFile, inplace=True, backup='.bak') as file: for line in file: print(line.replace(CarOr, CarNew), end='') file.close ()
Я рекомендую его стоит проверить это небольшая программа. Регулярные выражения-это путь.
https://github.com/khranjan/pythonprogramming/tree/master/findandreplace
Я немного изменил сообщение Jayram Singh, чтобы заменить каждый экземпляр a'!'символ к числу, которое я хотел увеличить с каждым экземпляром. Подумал, что это может быть полезно для тех, кто хочет изменить символ, который произошел более одного раза в строке и хотел повторить. Надеюсь, это кому-то поможет. PS-Я очень новичок в кодировании, поэтому извиняюсь, если мой пост неуместен в любом случае, но это сработало для меня.
f1 = open('file1.txt', 'r') f2 = open('file2.txt', 'w') n = 1 # if word=='!'replace w/ [n] & increment n; else append same word to # file2 for line in f1: for word in line: if word == '!': f2.write(word.replace('!', f'[{n}]')) n += 1 else: f2.write(word) f1.close() f2.close()
def word_replace(filename,old,new): c=0 with open(filename,'r+',encoding ='utf-8') as f: a=f.read() b=a.split() for i in range(0,len(b)): if b[i]==old: c=c+1 old=old.center(len(old)+2) new=new.center(len(new)+2) d=a.replace(old,new,c) f.truncate(0) f.seek(0) f.write(d) print('All words have been replaced!!!')
def findReplace (найти, заменить):
import os src = os.path.join(os.getcwd(), os.pardir) **`//To get the folder in which files are present`** for path, dirs, files in os.walk(os.path.abspath(src)): for name in files: if name.endswith('.py'): filepath = os.path.join(path, name) with open(filepath) as f: s = f.read() s = s.replace(find, replace) with open(filepath, "w") as f: f.write(s)
Comments
Делать один раз и если уже есть .bak замену не повторять:
<pre>
<code>
def replace_set(infile):
# Замена старых разделов в конфиге 'SetXXXXXX' на 'Part_XXXXXX'
old_word = 'Set'
new_word = 'Part_'
skip_word = 'Settings'
if not os.path.isfile(infile):
print ('File not found: ' + infile)
return
if os.path.isfile(infile + '.bak'):
print ('Backup file alredy exist: ' + infile + '.bak')
return
try:
os.rename(infile, infile + '.bak')
except:
print ('Error file backup.')
return
f1=open(infile + '.bak','r')
filedata = f1.read().split('\n')
f1.close()
i = 0
f2=open(infile,'w')
for line in filedata:
i += 1
e = '\n' if i < len(filedata) else ''
if line.find(skip_word) == -1:
m = line.replace(old_word, new_word) + e
else:
m = line + e
f2.write(m)
f2.close()
</code></pre>
Проверено, работает!
Извиняйте! Удалить свой ответ тоже никак!
Ну а модератору просьба исправить и оформить пост выше по правильному.