Ersetzen Sie die Zeichenfolge innerhalb des Dateiinhalts


97

Wie kann ich eine Datei, Stud.txt, öffnen und dann alle Vorkommen von "A" durch "Orange" ersetzen?


4
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].
S.Lott

Antworten:


181
with open("Stud.txt", "rt") as fin:
    with open("out.txt", "wt") as fout:
        for line in fin:
            fout.write(line.replace('A', 'Orange'))

8
"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 not in s:
            print('"{old_string}" not found in {filename}.'.format(**locals()))
            return

    # Safely write the changed content, if found in the file
    with 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 .


Diese Lösung ist besser, da Sie die Datei nicht anders als in der obigen Antwort umbenennen.

47
#!/usr/bin/python

with open(FileName) as f:
    newText=f.read().replace('A', 'Orange')

with open(FileName, "w") as f:
    f.write(newText)

1
Kurz und prägnant, beste Antwort IMO
Briford Wylie

11

Etwas wie

file = open('Stud.txt')
contents = file.read()
replaced_contents = contents.replace('A', 'Orange')

<do stuff with the result>

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)


2

Verwenden von pathlib ( https://docs.python.org/3/library/pathlib.html )

from pathlib import Path
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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.