如何使用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...' )
输入文件:
这是abcd,这是abcd
这是虚拟文本文件。
这是搜索和替换工作方式abcd
当我在上面的输入文件中搜索并替换'abcd'中的'ram'时,它就像魅力一样。但当我这样做时,反之亦然,即用'ram'取代'abcd',最后会留下一些垃圾字符。
用'ram'替换'abcd'
嗨这是ram嗨这是ram
这是虚拟文本文件。
这是rambcd的搜索和替换工作方式
答案 0 :(得分:222)
正如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)
除非你有一个庞大的文件可以使用,它太大而无法一次性加载到内存中,或者你担心如果在你将数据写入数据的第二步中中断过程可能导致数据丢失文件。
答案 1 :(得分:191)
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='')
答案 2 :(得分:45)
正如杰克艾德利发布的那样,以及J.F.塞巴斯蒂安指出,这段代码不起作用:
# 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会在打开写入时覆盖该文件。
答案 3 :(得分:40)
您可以像这样替换
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()
答案 4 :(得分:2)
您的问题源于对同一文件的读取和写入。不要打开fileToSearch
进行撰写,而是打开一个实际的临时文件,然后在完成并关闭tempFile
后,使用os.rename
将新文件移到fileToSearch
上。
答案 5 :(得分:2)
这个答案对我有用。以读取模式打开文件。以字符串格式读取文件。按预期替换文本。关闭文件。再次以写入模式打开文件。最后,将替换后的文本写入同一个文件。
with open("file_name", "r+") as text_file:
texts = text_file.read()
texts = texts.replace("to_replace", "replace_string")
with open(file_name, "w") as text_file:
text_file.write(texts)
except FileNotFoundError as f:
print("Could not find the file you are trying to read.")
答案 6 :(得分:2)
最新答案,但这是我用来在文本文件中查找和替换的内容:
with open("test.txt") as r:
text = r.read().replace("THIS", "THAT")
with open("test.txt", "w") as w:
w.write(text)
答案 7 :(得分:2)
(pip install python-util)
from pyutil import filereplace
filereplace("somefile.txt","abcd","ram")
第二个参数(要替换的东西,例如“ abcd”也可以是正则表达式)
将取代所有事件
答案 8 :(得分:1)
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!!!')
答案 9 :(得分:1)
您也可以使用pathlib
。
from pathlib2 import Path
path = Path(file_to_search)
text = path.read_text()
text = text.replace(text_to_search, replacement_text)
path.write_text(text)
答案 10 :(得分:1)
我做到了:
#!/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 ()
答案 11 :(得分:1)
我遇到了同样的问题。问题在于,当您在变量中加载 .txt 时,您将其用作字符串数组,而它是字符数组。
implementation("org.slf4j:slf4j-nop:2.0.0-alpha1")
答案 12 :(得分:1)
我的变体,整个文件上一次只有一个字。
我将它读入内存。
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)
答案 13 :(得分:0)
我稍微修改了Jayram Singh的帖子,以便替换'!'的每个实例。字符到我希望随每个实例递增的数字。认为对于想要修改每行多次出现且想要迭代的角色的人可能会有所帮助。希望能帮助别人。 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()
答案 14 :(得分:0)
使用单个with块,您可以搜索和替换文本:
with open('file.txt','r+') as f:
filedata = f.read()
filedata = filedata.replace('abc','xyz')
f.truncate(0)
f.write(filedata)
答案 15 :(得分:0)
我建议值得一试这个小程序。正则表达式是可行的方法。
https://github.com/khranjan/pythonprogramming/tree/master/findandreplace
答案 16 :(得分:0)
除了已经提到的答案外,这里还解释了为什么结尾处会有一些随机字符:
您正在以r+
模式而非w
模式打开文件。关键区别在于w
模式在您打开文件后立即清除文件的内容,而r+
则不会。
这意味着,如果您的文件内容为“ 123456789”,并且向其写入“ www”,则将获得“ www456789”。它使用新的输入覆盖字符,但保留所有其余的输入。
您可以使用truncate(<startPosition>)
来清除文件内容的一部分,但是最好先将更新的文件内容保存到字符串中,然后再进行truncate(0)
并将其全部写入。
或者,您可以use my library:D
答案 17 :(得分:0)
我尝试了这个并使用了 readlines 而不是 read
with open('dummy.txt','r') as file:
list = file.readlines()
print(f'before removal {list}')
for i in list[:]:
list.remove(i)
print(f'After removal {list}')
with open('dummy.txt','w+') as f:
for i in list:
f.write(i)
答案 18 :(得分:-1)
像这样:
def find_and_replace(file, word, replacement):
with open(file, 'r+') as f:
text = f.read()
f.write(text.replace(word, replacement))
答案 19 :(得分:-2)
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)
答案 20 :(得分:-2)
我已将此作为课程练习来解决:打开文件、查找和替换字符串并写入新文件。
class Letter:
def __init__(self):
with open("./Input/Names/invited_names.txt", "r") as file:
# read the list of names
list_names = [line.rstrip() for line in file]
with open("./Input/Letters/starting_letter.docx", "r") as f:
# read letter
file_source = f.read()
for name in list_names:
with open(f"./Output/ReadyToSend/LetterTo{name}.docx", "w") as f:
# replace [name] with name of the list in the file
replace_string = file_source.replace('[name]', name)
# write to a new file
f.write(replace_string)
brief = Letter()