34

私はPythonを初めて使用します。ファイルを開いて、特定の単語のすべてのインスタンスをPython経由で特定の置換に置き換えられるようにしたい。例として、すべての単語「zero」を「0」に、「temp」を「bob」に、「garbage」を「nothing」に置き換えます。

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

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について知っていることから、これも本当に理想的なソリューションではありません。これを行うための最良の方法を知りたいです。よろしくお願いします!

4

7 に答える 7

84

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

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.items():
            line = line.replace(src, target)
        outfile.write(line)

編集Eildosaのコメントに対処するために、別のファイルに書き込まずにこれを実行したい場合は、ソースファイル全体をメモリに読み込む必要があります。

lines = []
with open('path/to/input/file') as infile:
    for line in infile:
        for src, target in replacements.items():
            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 2.xを使用している場合は、replacements.iteritems()代わりにを使用してくださいreplacements.items()

于 2012-10-26T14:58:06.390 に答える
8

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

# 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'))
于 2016-01-21T23:20:57.213 に答える
7

dict私は次のようなものにとを使用することを検討するかもしれませんre.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これには、重複する一致に対してもう少し堅牢であるという点で、わずかな利点があります。

于 2012-10-26T15:00:42.800 に答える
5

本質的な方法は

  • read()
  • data = data.replace()必要なだけ何度でも
  • write()

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

read()ファイルオブジェクトの反復に置き換えることができます。

于 2012-10-26T14:56:45.083 に答える
3

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

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

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

于 2012-10-26T15:08:12.773 に答える
0

標準入力から読み取り、「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
于 2012-10-26T16:09:28.987 に答える
-1

これは私が今使用した短くて単純な例です:

もしも:

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
于 2016-03-05T02:16:38.820 に答える