web-dev-qa-db-ja.com

ファイル内のテキストをPython

私はPythonが初めてです。ファイルを開いて、特定の単語のすべてのインスタンスをPythonを介して指定された置換に置き換えることができます。例として、すべての単語「ゼロ」を「0」に、「一時」を「ボブ」に、「ごみ」を「無」に置き換えます。

私は最初にこれを使い始めました:

for line in fileinput.input(fin):
        fout.write(line.replace('zero', '0'))
        fout.write(line.replace('temp','bob'))
        fout.write(line.replace('garbage','nothing'))

しかし、これはこれを行うためのリモートの正しい方法だとは思わない。次に、行にこれらの項目が含まれているかどうかを確認するifステートメントを実行し、行に含まれている項目を置き換えることを考えましたが、私が知っているPython理想的なソリューションです。これを行う最善の方法を知りたいと思います。

25
shadonar

これはそれを行う必要があります

replacements = {'zero':'0', 'temp':'bob', 'garbage':'nothing'}

with open('path/to/input/file') as infile, open('path/to/output/file', 'w') as outfile:
    for line in infile:
        for src, target in replacements.iteritems():
            line = line.replace(src, target)
        outfile.write(line)

[〜#〜] edit [〜#〜]:宛てに Eildosaのコメント 、書かずにこれをしたい場合別のファイルに保存すると、ソースファイル全体をメモリに読み込む必要があります。

lines = []
with open('path/to/input/file') as infile:
    for line in infile:
        for src, target in replacements.iteritems():
            line = line.replace(src, target)
        lines.append(line)
with open('path/to/input/file', 'w') as outfile:
    for line in lines:
        outfile.write(line)

編集:Python 3.xを使用している場合は、replacements.items()ではなくreplacements.iteritems()を使用してください

72
inspectorG4dget

dictre.subこのようなもの:

import re
repldict = {'zero':'0', 'one':'1' ,'temp':'bob','garage':'nothing'}
def replfunc(match):
    return repldict[match.group(0)]

regex = re.compile('|'.join(re.escape(x) for x in repldict))
with open('file.txt') as fin, open('fout.txt','w') as fout:
    for line in fin:
        fout.write(regex.sub(replfunc,line))

これはreplaceにわずかに利点があり、重複する一致に対してもう少し堅牢です。

7
mgilson

ファイルが短い場合(または極端に長くない場合でも)、次のスニペットを使用してテキストを所定の場所に置き換えることができます。

# Replace variables in file
with open('path/to/in-out-file', 'r+') as f:
    content = f.read()
    f.seek(0)
    f.truncate()
    f.write(content.replace('replace this', 'with this'))
7
John Calcote

本質的な方法は

  • read()
  • data = data.replace()必要な頻度で
  • write()

データ全体を一度に読み書きするか、それよりも小さい部分で読み書きするかはあなた次第です。予想されるファイルサイズに依存させる必要があります。

read()は、ファイルオブジェクトの繰り返しに置き換えることができます。

4
glglgl

それを書くより速い方法は...

in = open('path/to/input/file').read()
out = open('path/to/input/file', 'w')
replacements = {'zero':'0', 'temp':'bob', 'garbage':'nothing'}
for i in replacements.keys():
    in = in.replace(i, replacements[i])
out.write(in)
out.close

これにより、他の回答が示唆する多くの反復が排除され、より長いファイルのプロセスが高速化されます。

2
Matt Olan

これは、先ほど使用した短く簡単な例です。

次の場合:

fp = open("file.txt", "w")

次に:

fp.write(line.replace('is', 'now'))
// "This is me" becomes "This now me"

しない:

line.replace('is', 'now')
fp.write(line)
// "This is me" not changed while writing
0
AmazingDayToday

標準入力から読み取り、次のように「code.py」を書き込みます。

import sys

rep = {'zero':'0', 'temp':'bob', 'garbage':'nothing'}

for line in sys.stdin:
    for k, v in rep.iteritems():
        line = line.replace(k, v)
    print line

次に、リダイレクトまたはパイピングでスクリプトを実行します( http://en.wikipedia.org/wiki/Redirection_(computing)

python code.py < infile > outfile
0
satomacoto