如何使用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( '\n\n Press Enter to exit...' ) 

输入文件:

嗨,这是abcd嗨,这是abcd

这是假文本文件。

这是如何搜索和替换作品abcd

当我在上面的输入文件中用'abcd'搜索并替换'ram'时,它就像魅力一样。 但是当我用“ram”做副词“abcd”时,一些垃圾字符留在最后。

用“ram”取代“abcd”

嗨,这是ram嗨,这是ram

这是假文本文件。

这是如何搜索和替换工程内存

fileinput已经支持就地编辑。 在这种情况下,它将stdout重定向到文件:

 #!/usr/bin/env python3 import fileinput with fileinput.FileInput(fileToSearch, inplace=True, backup='.bak') as file: for line in file: print(line.replace(textToSearch, textToReplace), 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) 

除非你有一个庞大的文件来处理,这是太大,无法一次加载到内存中。

正如Jack Aidley所发布的,JF Sebastian指出的那样,这段代码将不起作用:

  # 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) 

我建议值得检查一下这个小程序。 正则表达式是要走的路。

https://github.com/khranjan/pythonprogramming/tree/master/findandreplace

我已经这样做了:

 #!/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 () 

我稍微修改了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()