CSV erste zeile ändern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
tron46
User
Beiträge: 9
Registriert: Sonntag 27. Mai 2012, 18:34

Dienstag 27. Oktober 2015, 16:58

Guten Abend,

ich würde gerne die erste Zeile einer CSV Datei ändern.

Bis her mache ich es so:
Ich lese die CSV Datei ein und lösche die erste Zeile
Ich erstelle eine neue CSV Datei, in der ich die erste Zeile schon geschrieben habe und schreibe die Daten aus der Organal CSV Datei hinten dran.

Das Problem ist das die Datei groß ist und dadurch das ganze etwas dauert.
Gibt es eine Möglichkeit nur die erste Zeile schneller zu ändern?

Viele Grüße
tron46
DasIch
User
Beiträge: 2465
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Dienstag 27. Oktober 2015, 17:07

Sofern du die Zeile durch eine Zeile ersetzt die exakt genauso lang ist, kannst du die Zeile ersetzen ohne eine neue Datei anzulegen. Ansonsten kommst du um den Ansatz den du jetzt nutzt nicht drumherum. Wenn du den Code posten würdest, könnte man aber vielleicht daran noch ein paar Dinge verbessern.
BlackJack

Dienstag 27. Oktober 2015, 17:09

@tron46: So ganz allgemein gibt es keinen schnelleren Weg. Nur falls die Grösse der Zeile in Bytes sich durch die Änderung nicht verändert könnte man das ”in place” machen, aber der allgemeine Weg ist das neuschreiben der Datei mit der geänderten Kopfzeile. Man muss dabei allerdings nicht die ganzen Daten auf einmal in den Speicher laden, denn man kann ja die alte Datei öffnen, die Kopfzeile überlesen, die neue Datei öffnen und die neue Kopfzeile schreiben, und dann direkt für das schreiben der weiteren Zeilen das `reader`-Objekt von der alten Datei als Quelle verwenden (ungetestet):

Code: Alles auswählen

    with open('old.csv', 'rb') as in_file:
        with open('new.csv', 'wb') as out_file:
            writer = csv.writer(out_file)
            writer.writerow(new_headers)
            writer.writerows(islice(csv.reader(in_file), 1, None))
Mit `islice()` aus dem `itertools`-Modul.
Antworten