web-dev-qa-db-ja.com

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

上記の入力ファイルで 'ram'を 'abcd'で検索して置き換えると、それは魅力的に機能します。しかし、その逆の場合、つまり 'abcd'を 'ram'に置き換えると、末尾にジャンク文字がいくつか残ります。

'abcd'を 'ram'に置き換える

こんにちはこれはラムですこんにちはこれはラムです

これはダミーのテキストファイルです。

これが検索と置換のしくみですrambcd

149
Shriram

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='')
188
jfs

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番目のステップで処理が中断された場合にデータが失われる可能性があることを心配しないでください。

221
Jack Aidley

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を同じファイルにすることができます。

45
Neamerjell

あなたはこのような取り替えをすることができます

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()
40
Jayram Singh

あなたの問題は同じファイルから読み書きすることから生じます。書き込み用にfileToSearchを開くのではなく、実際の一時ファイルを開き、完了してtempFileを閉じた後で、os.renameを使用して新しいファイルをfileToSearchに移動します。

2
icktoofay

私の亜種は、ファイル全体に対して一度に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)
1
LiPi

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)
1
Yuya Takashina

私はこれをしました:

#!/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 ()
1
Zelmik
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!!!')
1
Vinit Pillai

私はこの小さなプログラムをチェックする価値があることをお勧めします。正規表現はその道です。

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

0
RJay khadka

シングルwithブロックを使用すると、テキストを検索および置換できます。

with open('file.txt','r+') as f:
    filedata = f.read()
    filedata = filedata.replace('abc','xyz')
    f.truncate(0)
    f.write(filedata)
0

'!'のすべてのインスタンスを置き換えるために、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()
0
Doc5506

(pip install python-util)

from pyutil import filereplace

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

2番目のパラメーター(置き換えられるもの、たとえば「abcd」は正規表現でもかまいません)
すべての出現を置き換えます

0
MisterL2