Insert-string am Anfang jeder Zeile
Wie kann ich einfügen eines Strings am Anfang jeder Zeile in einer text-Datei habe ich folgenden code:
f = open('./ampo.txt', 'r+')
with open('./ampo.txt') as infile:
for line in infile:
f.insert(0, 'EDF ')
f.close
bekomme ich die folgende Fehlermeldung:
"'Datei' - Objekt hat kein Attribut 'einfügen'"
Bitte beachten Sie, dass im eine vollständige Programmier-n00b.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Python kommt mit Batterien im Lieferumfang enthalten:
Im Gegensatz zu den Lösungen, die bereits gepostet, dies bewahrt auch die Datei-Berechtigungen.
for-loop
iteriert über die Zeilen inampo.txt
eine Zeile zu einem Zeitpunkt.sys.stdout.write
ist fast das gleiche wieprint
. Der Grund, warum ich wählte zu verwendensys.stdout.write
stattprint
ist, weilprint
fügt einen zusätzlichen Zeilenumbruch, währendsys.stdout.write
nicht. Wegen derinplace=True
argumentfileinput
verschiebt das original ampo.txt um eine temporäre Datei, dann leitet stdout in eine neue Datei namensampo.txt
. Dann kopiert Berechtigungen und entfernt die tempory Datei. Es gibt noch weitere Optionen, wie das halten einer backup-Datei; siehe die Dokumentation für mehr info.if fileinput.filelineno() == 3:
auf das Verhalten ändern, je nachdem, auf welcher Linie Sie sich befinden.Die Sie nicht ändern können eine Datei inplace so. Dateien nicht unterstützen, einsetzen. Sie müssen das alles Lesen und dann schreiben es alle wieder raus.
Hierzu können Sie zeilenweise, wenn Sie es wünschen. Aber in diesem Fall müssen Sie zum schreiben in eine temporäre Datei und ersetzen Sie das original. Also, für genügend kleine Dateien, es ist nur einfacher, es zu tun in einem Rutsch, wie diese:
[x for y in z]
form schafft Sie ein neues list-Objekt und die alten kann man nicht garbage-collected werden, bis das neue aufgebaut ist, so dass an einem Punkt es sind alle original-Saiten und alle geänderten strings im Speicher auf einmal. Aber es gibt auch(x for y in z)
form, die stattdessen erzeugt ein generator. Generatoren sind faul; Sie führen den Ausdruck auf einen input-Wert in einen Zeit-und es zurückgeben, so dass es gesammelt werden kann, bevor die nächste ist erforderlich, und Sie werden nie im Speicher an der gleichen Zeit. In diesem Fall müssen Sie vorsichtig sein, es nicht zu machen zu faul, da die Datei auch unterstützt faul zu Lesen.['EDF ' + line for line in open('./ampo.txt', 'r')]
nutzt der generator die Datei zu Lesen, faul, aber als wertet die Liste eifrig, um die Datei vollständig in den Arbeitsspeicher, bevor es umschreiben.('EDF ' + line for line in f.readlines())
verwendet das eager-lese-Funktion, um die Datei im Speicher, sondern als generator zu konstruieren, der geänderte text gespannt. Natürlich, wenn Sie verwendet-generator für die beiden, Sie würden sich verbrennen schlecht, weil Sie anfangen würde, das umschreiben der Datei, bevor Sie alle Daten aus es.Hier ist eine Lösung, wo Sie schreiben in eine temporäre Datei und verschieben Sie Sie in Platz. Möglicherweise bevorzugen Sie diese version, wenn die Datei, die Sie umschreiben, ist sehr groß, da es vermeidet, halten den Inhalt der Datei in den Arbeitsspeicher, wie die Versionen, die Einbeziehung der
.read()
oder.readlines()
wird. Außerdem, wenn es irgendwelche Fehler beim Lesen oder schreiben, Ihre original-Datei wird sicher sein:Für eine Datei nicht zu groß:
Beachten Sie, dass , IN der THEORIE, IN DIESEM Fall (der Inhalt wird ergänzt), die
f.truncate()
möglicherweise nicht wirklich notwendig. Da die with-Anweisung soll die Datei schließen, richtig, dass ist zu sagen, schreiben ein EOF (end of file ) am Ende vor dem schließen.Das ist, was ich beobachtet habe an Beispielen.
Aber ich bin klug; ich denke, es ist besser, diese Anleitung sowieso. Wenn der content abnimmt, die with-Anweisung nicht schreiben, ein EOF-schließen Sie richtig die Datei weniger weit als die vorhergehende erste EOF, damit nachfolgende erste Zeichen in der Datei bleibt.
Also, wenn die mit der Anweisung doens nicht schreiben, EOF, wenn der content abnimmt, warum sollte er es schreiben, wenn der Inhalt erweitert ?
Für eine große Datei, um zu vermeiden, um alle Inhalte der Datei in der RAM auf einmal:
f.truncate()
?yield
) und all die Dinge, die Rückkehr einer von Ihren__iter__()
Methode (wiefile
).map
wo Sie hätten Verständnis in einem Fall und in einer Schleife in die andere ist nicht gut-python-Stil.