292

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
4

20 に答える 20

456

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)

作業するファイルが大きすぎて一度にメモリにロードできない場合や、ファイルにデータを書き込む 2 番目のステップでプロセスが中断された場合にデータが失われる可能性を懸念している場合を除きます。

于 2013-06-17T06:29:50.737 に答える
316

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='')
于 2013-12-15T10:47:01.250 に答える
59

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

Python 3.3 は書き込み用に開いたときにファイルを上書きするため、この方法を使用すると、filein と fileout を同じファイルにすることができます。

于 2014-04-05T05:19:15.027 に答える
53

こんな感じで交換できます

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()
于 2013-06-17T05:32:29.073 に答える
11

(pip install python-util)

from pyutil import filereplace

filereplace("somefile.txt","abcd","ram")

「abcd」をすべて「ram」に置き換えます。
この関数は、指定することで正規表現もサポートしますregex=True

from pyutil import filereplace

filereplace("somefile.txt","\\w+","ram",regex=True)

免責事項: 私は著者です ( https://github.com/MisterL2/python-util )

于 2019-08-23T13:43:29.623 に答える
3

単一の with ブロックを使用すると、テキストを検索して置換できます。

with open('file.txt','r+') as f:
    filedata = f.read()
    filedata = filedata.replace('abc','xyz')
    f.truncate(0)
    f.write(filedata)
于 2019-06-14T13:00:46.580 に答える
2

問題は、同じファイルの読み取りと書き込みに起因します。書き込み用に開くのではなくfileToSearch、実際の一時ファイルを開き、終了して を閉じた後tempFile、 を使用os.renameして新しいファイルを に移動しますfileToSearch

于 2013-06-17T05:43:36.550 に答える