如何使用Python搜索和替换文件中的文本?

问题描述 投票:157回答:13

如何使用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的搜索和替换工作方式

file text python-3.x replace
13个回答
192
投票

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

fileinput

0
投票

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

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


0
投票

我稍微修改了Jayram Singh的帖子,以便替换'!'的每一个实例。字符到我希望随每个实例递增的数字。认为对于想要修改每行多次出现且想要迭代的角色的人可能会有所帮助。希望能帮助别人。 PS-我对编码非常陌生如果我的帖子在任何方面都不合适而道歉,但这对我有用。

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!!!')

0
投票

使用单个带块,您可以搜索并替换文本:

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

-2
投票

def findReplace(查找,替换):

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

237
投票

正如michaelb958所指出的那样,你无法用不同长度的数据替换它,因为这会使其余的部分不合适。我不同意其他海报,建议你从一个文件中读取并写入另一个文件。相反,我会将文件读入内存,修复数据,然后在单独的步骤中将其写入同一文件。

stdout

除非你有一个庞大的文件可以使用,它太大而无法一次性加载到内存中,或者你担心如果在将数据写入文件的第二步中进程被中断,可能会丢失数据。


45
投票

正如杰克艾德利发布和J.F.塞巴斯蒂安指出的那样,这段代码不起作用:

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

但是这段代码会起作用(我已经测试过了):

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

使用此方法,filein和fileout可以是同一个文件,因为Python 3.3将在打开写入时覆盖该文件。


41
投票

你可以这样做替换

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

2
投票

您的问题源于对同一文件的读取和写入。而不是打开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() 进行写作,打开一个实际的临时文件,然后在你完成并关闭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上。


2
投票

你也可以使用os.rename

fileToSearch

1
投票

我的变体,在整个文件中一次一个字。

我把它读进记忆中。

pathlib

1
投票

我这样做了:

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)

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)
© www.soinside.com 2019 - 2024. All rights reserved.