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
上記の入力ファイルで 'ram'を 'abcd'で検索して置き換えると、それは魅力的に機能します。しかし、その逆の場合、つまり 'abcd'を 'ram'に置き換えると、末尾にジャンク文字がいくつか残ります。
'abcd'を 'ram'に置き換える
こんにちはこれはラムですこんにちはこれはラムです
これはダミーのテキストファイルです。
これが検索と置換のしくみですrambcd
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)
一度に大量のファイルを処理してメモリにロードするには大きすぎる場合、またはファイルにデータを書き込む2番目のステップで処理が中断された場合にデータが失われる可能性があることを心配しないでください。
Jack Aidleyが投稿しJ.F. 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を同じファイルにすることができます。
あなたはこのような取り替えをすることができます
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
に移動します。
私の亜種は、ファイル全体に対して一度に1つのWordです。
私はそれをメモリに読みました。
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)
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)
私はこれをしました:
#!/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 ()
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!!!')
私はこの小さなプログラムをチェックする価値があることをお勧めします。正規表現はその道です。
https://github.com/khranjan/pythonprogramming/tree/master/findandreplace
シングルwithブロックを使用すると、テキストを検索および置換できます。
with open('file.txt','r+') as f:
filedata = f.read()
filedata = filedata.replace('abc','xyz')
f.truncate(0)
f.write(filedata)
'!'のすべてのインスタンスを置き換えるために、Jayram Singhの投稿を少し修正しました。各インスタンスで増分したい数値への文字。 1行に複数回出現して繰り返したい文字を修正したいという人にとっては、それは役に立つかもしれないと思いました。誰かに役立つことを願っています。 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()
(pip install python-util)
from pyutil import filereplace
filereplace("somefile.txt","abcd","ram")
2番目のパラメーター(置き換えられるもの、たとえば「abcd」は正規表現でもかまいません)
すべての出現を置き換えます