Wie suche und ersetze ich Text in einer Datei mit Python 3?
Hier ist mein Code:
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...' )
Eingabedatei:
hi this is abcd hi this is abcd
This is dummy text file.
This is how search and replace works abcd
Wenn ich 'ram' in der obigen Eingabedatei suche und durch 'abcd' ersetze, funktioniert das als Zauber. Aber wenn ich es umgekehrt mache, dh 'abcd' durch 'ram' ersetze, bleiben am Ende einige Junk-Charaktere übrig.
Ersetzen von 'abcd' durch 'ram'
hi this is ram hi this is ram
This is dummy text file.
This is how search and replace works rambcd
Antworten:
fileinput
unterstützt bereits die Inplace-Bearbeitung.stdout
In diesem Fall wird zur Datei umgeleitet :quelle
end=''
Argument tun?line
hat bereits eine neue Zeile.end
ist standardmäßig eine neue Zeile, damitend=''
dieprint()
Funktion keine zusätzliche neue Zeile drucktfileinput
ist kein Werkzeug für alle Arbeitsplätze ( nichts ) , aber es gibt viele Fälle , in denen es ist das richtige Werkzeug zum Beispiel eines implementierensed
-ähnlichen Filter in Python. Verwenden Sie keinen Schraubenzieher, um Nägel zu schlagen.fileinput
dies (im Grunde genommen verwenden Sietry..finally
oder einen Kontextmanager, um sicherzustellen, dass Sie stdout danach wieder auf den ursprünglichen Wert zurücksetzen). Der Quellcode fürfileinput
ist ziemlich schrecklich und macht einige wirklich unsichere Dinge unter der Haube. Wenn es heute geschrieben worden wäre, bezweifle ich sehr, dass es es in die stdlib geschafft hätte.Wie von michaelb958 hervorgehoben, können Sie nicht durch Daten unterschiedlicher Länge ersetzen, da dadurch der Rest der Abschnitte fehl am Platz ist. Ich bin nicht einverstanden mit den anderen Postern, die vorschlagen, dass Sie aus einer Datei lesen und in eine andere schreiben. Stattdessen las ich die Datei in den Speicher, reparierte die Daten und schrieb sie dann in einem separaten Schritt in dieselbe Datei.
Es sei denn, Sie haben eine massive Datei zum Arbeiten, die zu groß ist, um auf einmal in den Speicher geladen zu werden, oder Sie sind besorgt über einen möglichen Datenverlust, wenn der Prozess während des zweiten Schritts, in dem Sie Daten in die Datei schreiben, unterbrochen wird.
quelle
with file = open(..):
ist nicht gültig Python (=
), obwohl die Absicht klar ist..replace()
ändert die Zeichenfolge nicht (sie ist unveränderlich), daher müssen Sie den zurückgegebenen Wert verwenden. Auf jeden Fall kann der Code, der große Dateien unterstützt , noch einfacher sein, es sei denn, Sie müssen Text suchen und ersetzen, der mehrere Zeilen umfasst.with
Anweisung schließt die Datei automatisch am Ende des Anweisungsblocks.Wie Jack Aidley gepostet hatte und JF Sebastian darauf hinwies, wird dieser Code nicht funktionieren:
Aber dieser Code wird funktionieren (ich habe ihn getestet):
Mit dieser Methode können filein und fileout dieselbe Datei sein, da Python 3.3 die Datei beim Öffnen zum Schreiben überschreibt.
quelle
with
-statement entfernen ? 2. Wie in meiner Antwort angegeben,fileinput
kann an Ort und Stelle funktionieren - es kann Daten in derselben Datei ersetzen (es verwendet intern eine temporäre Datei). Der Unterschied besteht darin, dassfileinput
nicht die gesamte Datei in den Speicher geladen werden muss.with
Blöcke minderwertig ist ).Sie können den Austausch so durchführen
quelle
Sie können auch verwenden
pathlib
.quelle
Mit einem Single mit Block können Sie Ihren Text suchen und ersetzen:
quelle
seek
den Anfang der Datei vergessen, bevor Sie sie geschrieben haben.truncate
tut das nicht und so haben Sie Müll in der Datei.Ihr Problem ergibt sich aus dem Lesen und Schreiben in dieselbe Datei. Anstatt Öffnung
fileToSearch
zum Schreiben, öffnen Sie eine tatsächliche temporäre Datei und dann , nachdem Sie fertig sind und geschlossen habentempFile
, verwenden ,os.rename
um die neue Datei über zu bewegenfileToSearch
.quelle
(pip install python-util)
Der zweite Parameter (das zu ersetzende Objekt, z. B. "abcd", kann auch ein regulärer Ausdruck sein)
ersetzt alle Vorkommen
quelle
Meine Variante, Wort für Wort in der gesamten Datei.
Ich habe es in Erinnerung behalten.
quelle
Ich hab's gemacht:
quelle
fileinput
nichtinplace=True
mitutf-8
.Ich habe Jayram Singhs Beitrag leicht modifiziert, um jede Instanz eines '!' Zeichen auf eine Zahl, die ich mit jeder Instanz erhöhen wollte. Dachte, es könnte für jemanden hilfreich sein, der ein Zeichen ändern wollte, das mehr als einmal pro Zeile vorkam und iterieren wollte. Hoffe das hilft jemandem. PS: Ich bin sehr neu im Codieren. Ich entschuldige mich, wenn mein Beitrag in irgendeiner Weise unangemessen ist, aber das hat bei mir funktioniert.
quelle
quelle
Wie so:
quelle
quelle