Bitte befolgen Sie (wie immer) die allgemeinen Fragenrichtlinien , geben Sie spezielle Einschränkungen an, zeigen Sie, was Sie bisher versucht haben, und fragen Sie, was Sie besonders verwirrt.
18
Bitte markieren Sie Ihre Hausaufgaben auch mit dem Tag [Hausaufgaben].
"t" für den Textmodus ist nur Python 3. Sie stellen auch einen Kontextmanager für Ihre Ausgabedatei bereit, können Ihre Eingabedatei jedoch nicht schließen, was inkonsistent erscheint.
Steven Rumbalski
1
@katrielalex: Es gibt keine Downvotes, ich habe einfach keine Upvotes gemacht. Aber Antworten auf Hausaufgaben zu geben ist nicht der richtige Weg, dies zu tun
BlueRaja - Danny Pflughoeft
Äh, ich habe nicht bemerkt, dass dies mit "Hausaufgaben" markiert war. Ich werde meine Antwort nicht löschen, aber in Zukunft vorsichtiger sein
Gareth Davidson
21
"Antworten auf Hausaufgabenprobleme geben" ist ein äußerst dummer Kommentar. Wenn jemand Hilfe will, dann hilf ihm. Nicht jeder will seine HW machen, manche wollen tatsächlich etwas lernen ...
KingMak
5
Ich brauchte dies für Hausaufgaben und es half mir ungemein
Mikeybeck
78
Wenn Sie die Zeichenfolgen in derselben Datei ersetzen möchten, müssen Sie den Inhalt wahrscheinlich in eine lokale Variable einlesen, schließen und zum Schreiben erneut öffnen:
In diesem Beispiel verwende ich die with-Anweisung , die die Datei schließt, nachdem der withBlock beendet wurde - entweder normalerweise, wenn der letzte Befehl ausgeführt wurde, oder durch eine Ausnahme.
def inplace_change(filename, old_string, new_string):# Safely read the input filename using 'with'with open(filename)as f:
s = f.read()if old_string notin s:print('"{old_string}" not found in {filename}.'.format(**locals()))return# Safely write the changed content, if found in the filewith open(filename,'w')as f:print('Changing "{old_string}" to "{new_string}" in {filename}'.format(**locals()))
s = s.replace(old_string, new_string)
f.write(s)
Es ist erwähnenswert, dass wir dies mit einer einzigen withAussage eleganter hätten tun können, wenn die Dateinamen unterschiedlich gewesen wären .
OP bezeichnet "alle Vorkommen". Dies bedeutet, auch wenn es sich um einen Teilstring handelt - was für Ihr Beispiel nicht funktioniert.
Durdu
7
with open('Stud.txt','r')as f:
newlines =[]for line in f.readlines():
newlines.append(line.replace('A','Orange'))with open('Stud.txt','w')as f:for line in newlines:
f.write(line)
from pathlib importPath
file =Path('Stud.txt')
file.write_text(file.read_text().replace('A','Orange'))
Wenn Eingabe- und Ausgabedateien unterschiedlich wären, würden Sie zwei verschiedene Variablen für read_textund verwenden write_text.
Wenn Sie eine Änderung wünschen, die komplexer als eine einzelne Ersetzung ist, würden Sie das Ergebnis read_texteiner Variablen zuweisen , es verarbeiten und den neuen Inhalt in einer anderen Variablen speichern und dann den neuen Inhalt mit speichern write_text.
Wenn Ihre Datei groß wäre, würden Sie einen Ansatz bevorzugen, bei dem nicht die gesamte Datei im Speicher gelesen, sondern zeilenweise verarbeitet wird, wie von Gareth Davidson in einer anderen Antwort gezeigt ( https://stackoverflow.com/a/4128192/3981273 ). Dies erfordert natürlich die Verwendung von zwei unterschiedlichen Dateien für die Eingabe und Ausgabe.
write_text funktioniert bei mir nicht. Die Datei wird nicht aktualisiert
Anurag
0
Am einfachsten ist es, dies mit regulären Ausdrücken zu tun, vorausgesetzt, Sie möchten über jede Zeile in der Datei (in der 'A' gespeichert ist) iterieren.
import re
input = file('C:\full_path\Stud.txt), 'r')
#when you try and write to a file with write permissions, it clears the file and writes only #what you tell it to the file. So we have to save the file first.
saved_input
for eachLine in input:
saved_input.append(eachLine)
#now we change entries with 'A' to 'Orange'
for i in range(0, len(old):
search = re.sub('A', 'Orange', saved_input[i])
if search is not None:
saved_input[i] = search
#now we open the file in write mode (clearing it) and writing saved_input back to it
input = file('C:\full_path\Stud.txt),'w')for each in saved_input:
input.write(each)
Antworten:
quelle
Wenn Sie die Zeichenfolgen in derselben Datei ersetzen möchten, müssen Sie den Inhalt wahrscheinlich in eine lokale Variable einlesen, schließen und zum Schreiben erneut öffnen:
In diesem Beispiel verwende ich die with-Anweisung , die die Datei schließt, nachdem der
with
Block beendet wurde - entweder normalerweise, wenn der letzte Befehl ausgeführt wurde, oder durch eine Ausnahme.Es ist erwähnenswert, dass wir dies mit einer einzigen
with
Aussage eleganter hätten tun können, wenn die Dateinamen unterschiedlich gewesen wären .quelle
quelle
Etwas wie
quelle
quelle
Wenn Sie unter Linux arbeiten und nur das Wort
dog
durch ersetzen möchten,cat
können Sie Folgendes tun:text.txt:
Linux-Befehl:
Ausgabe:
Ursprünglicher Beitrag: /ubuntu/20414/find-and-replace-text-within-a-file-using-commands
quelle
Verwenden von pathlib ( https://docs.python.org/3/library/pathlib.html )
Wenn Eingabe- und Ausgabedateien unterschiedlich wären, würden Sie zwei verschiedene Variablen für
read_text
und verwendenwrite_text
.Wenn Sie eine Änderung wünschen, die komplexer als eine einzelne Ersetzung ist, würden Sie das Ergebnis
read_text
einer Variablen zuweisen , es verarbeiten und den neuen Inhalt in einer anderen Variablen speichern und dann den neuen Inhalt mit speichernwrite_text
.Wenn Ihre Datei groß wäre, würden Sie einen Ansatz bevorzugen, bei dem nicht die gesamte Datei im Speicher gelesen, sondern zeilenweise verarbeitet wird, wie von Gareth Davidson in einer anderen Antwort gezeigt ( https://stackoverflow.com/a/4128192/3981273 ). Dies erfordert natürlich die Verwendung von zwei unterschiedlichen Dateien für die Eingabe und Ausgabe.
quelle
Am einfachsten ist es, dies mit regulären Ausdrücken zu tun, vorausgesetzt, Sie möchten über jede Zeile in der Datei (in der 'A' gespeichert ist) iterieren.
quelle