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!
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()
.
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.
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'))
Der wesentliche Weg ist
read()
,data = data.replace()
so oft Sie brauchen und dannwrite()
.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.
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.
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
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