Text in einer Datei mit Python hinzufügen (ohne sie zu ersetzen)

7

Ich habe eine Datei mit IDs und Informationen, wie folgt:

%Vor%

und ich möchte ein Flag auf einigen der Zeile hinzufügen, also wenn ich ein Wörterbuch

habe %Vor%

das Ergebnis, das ich möchte, ist

%Vor%

Also habe ich diesen Code gemacht

%Vor%

Also, mein Python-Code könnte schlecht sein, aber das Problem ist, dass ich mit diesem Code Text ersetze, also ist die Datei durcheinander. Wie kann ich schreiben ohne zu ersetzen? und wenn Sie bessere Ideen für den Code haben, sind Sie herzlich willkommen ...

    
chuse 12.01.2012, 15:51
quelle

6 Antworten

6

Ich sehe hier zwei Probleme:

Lesen und Schreiben von / in dieselbe Datei

Das funktioniert nicht so gut. Es wäre besser, von einer Datei zu lesen und zu einer anderen zu schreiben (auf diese Weise verlieren Sie auch keine Daten, wenn in Ihrem Programm etwas schief geht). Beispiel:

%Vor%

Syntaktische / semantische Fehler

Sie haben einen syntaktischen Fehler in Ihrem Code-Snippet, der Zeile

%Vor%

ist nicht gültig (und Python sollte sich darüber beschweren!).

Einige andere Dinge zu beachten:

  • in flags.iterkeys() ist semantisch äquivalent zu in flags
  • Sie können auch while l anstelle von while l is True verwenden. Noch besser: Sie könnten die Flag-Variable l komplett löschen und mit break aus der Schleife springen, wenn ein Fehler auftritt.

Mein Versuch

%Vor%

Wenn Sie wissen, wie man eine Shell benutzt, können Sie Ihr Leben vereinfachen, wenn Sie STDIN / STDOUT nur für die Dateneingabe und -ausgabe verwenden. Sie sparen sich dann die Dateiverwaltung und lassen dem Benutzer mehr Flexibilität, wie er Ihr Skript verwenden kann.

    
Niklas B. 12.01.2012, 16:05
quelle
9

Sie können nicht in die Datei schreiben und "einfügen". Der beste Weg wäre, Ihre Datei zu lesen und den Inhalt mit Änderungen an einer neuen Datei auszugeben und sie dann nach Bedarf umzubenennen.

    
MattH 12.01.2012 15:59
quelle
2

Ich möchte stdin/stdout Umleitung:

verwenden %Vor% %Vor%     
kev 12.01.2012 16:12
quelle
2

Mit dem Modul fileinput ist es möglich, eine Datei direkt zu bearbeiten:

%Vor%     
MatToufoutu 12.01.2012 16:26
quelle
0

Lasst uns zuerst das Skript ein bisschen aufräumen:

%Vor%

Es ist eine Weile her, seit ich zuletzt mit Lesen und Schreiben in der gleichen Datei herumgespielt habe, also könnte ich ein bisschen daneben sein.

    
Morten Siebuhr 12.01.2012 16:01
quelle
0

Das Problem besteht darin, dass Sie versuchen, das gleiche Dateiobjekt zu lesen und zu schreiben. Sie müssen stattdessen eine neue Datei erstellen.

Allerdings gibt es ein paar andere Dinge, die Sie als erstes in Betracht ziehen sollten ...

Als Erstes können Sie Dinge vereinfachen, indem Sie das Dateiobjekt direkt durchlaufen, anstatt eine while-Schleife zu verwenden. Zum Beispiel:

%Vor%

In diesem Beispiel drucken wir nur die gewünschte Ausgabe. Wenn die Datei klein ist, könnten wir einfach so etwas machen

%Vor%

Wenn es sich jedoch um eine große Datei handelt, möchten wir möglicherweise nicht eine ganze Kopie im Speicher ablegen.

In diesem Fall sollten wir die ursprüngliche Datei über iterieren und in eine andere Datei schreiben. Dann müssten wir die neue Datei in den Namen der ursprünglichen Datei umbenennen.

Wenn wir sehr vorsichtig sein wollen, machen wir etwas wie das Folgende:

%Vor%

Der try:... finally:... -Teil führt im Wesentlichen manuell aus, was eine with -Anweisung für ein Dateiobjekt tut. Es ist wohl etwas sauberer, als zwei mit Anweisungen in diesem speziellen Fall zu verschachteln, aber ich benutze es meistens, um die alternative (ältere) Syntax dafür zu zeigen. Im Idealfall würden Sie wahrscheinlich diesen Code ähnlich schreiben:

%Vor%

Allerdings werden wir immer komplexer, je weiter wir damit fortfahren.

In Ihrem Fall ist das zweite Beispiel (Lesen der gesamten Datei in den Speicher und dann das Überschreiben der Originaldatei) wahrscheinlich, was Sie wollen.

    
Joe Kington 12.01.2012 16:41
quelle

Tags und Links