it-swarm.com.de

ersetzen von Text in einer Datei durch Python

Ich bin neu in Python. Ich möchte in der Lage sein, eine Datei zu öffnen und jede Instanz bestimmter Wörter durch einen bestimmten Ersatz über Python zu ersetzen. Beispiel: Ersetzen Sie jedes Wort 'null' durch '0', 'temp' durch 'bob' und sagen Sie 'Müll' durch 'nichts'.

Ich hatte zuerst angefangen, dies zu benutzen:

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

aber ich denke nicht, dass dies sogar ein aus der Ferne korrekter Weg ist. Ich habe dann darüber nachgedacht, if -Anweisungen auszuführen, um zu prüfen, ob die Zeile diese Elemente enthält, und wenn ja, ersetzen Sie die, die die Zeile enthält, aber nach meiner Kenntnis von Python ist dies auch keine wirklich ideale Lösung. Ich würde gerne wissen, wie man das am besten macht. Vielen Dank im Voraus!

25
shadonar

Das sollte es tun

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: Zum Ansprechen von Eildosas Kommentar Wenn Sie dies tun wollten, ohne in eine andere Datei zu schreiben, müssen Sie Ihre gesamte Quelldatei in den Speicher lesen:

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)

Edit: Wenn Sie Python 3.x verwenden, verwenden Sie replacements.items() anstelle von replacements.iteritems().

71
inspectorG4dget

Ich könnte in Betracht ziehen, eine dict und re.sub für so etwas zu verwenden:

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

Dies hat einen kleinen Vorteil gegenüber replace, da es gegenüber überlappenden Übereinstimmungen etwas robuster ist.

7
mgilson

Wenn Ihre Datei kurz ist (oder sogar nicht extrem lang ist), können Sie den folgenden Textausschnitt verwenden, um den Text an seiner Stelle zu ersetzen:

# 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'))
6
John Calcote

Der wesentliche Weg ist

  • read(),
  • data = data.replace() so oft Sie brauchen und dann
  • write().

Ob Sie die gesamten Daten auf einmal oder in kleineren Teilen lesen und schreiben, bleibt Ihnen überlassen. Sie sollten dies von der erwarteten Dateigröße abhängig machen.

read() kann durch die Iteration über das Dateiobjekt ersetzt werden.

4
glglgl

Schnellere Schreibweise wäre es ...

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

Dadurch wurden viele der Iterationen, die die anderen Antworten vorschlagen, eliminiert und der Prozess für längere Dateien wird beschleunigt.

2
Matt Olan

Dies ist ein kurzes und einfaches Beispiel, das ich gerade verwendet habe:

Ob:

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

Dann:

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

Nicht:

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

Lesen Sie von der Standardeingabe aus wie folgt:

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

Führen Sie dann das Skript mit Umleitung oder Piping aus ( http://en.wikipedia.org/wiki/Redirection_(computing)

python code.py < infile > outfile
0
satomacoto