geht's auch smarter ?

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

Dienstag 5. Mai 2020, 08:57

moinsen,
ich habe eine csv-datei, die 30 einträge hat. mehr sollen es auch nicht werden. täglich kommt EIN neuer eintrag (neue zeile am ende der datei) hinzu, weswegen die zweite zeile (in der ersten zeile befinden sich die spaltenüberschriften) gelöscht werden muss. mein code:

Code: Alles auswählen

file = 'E:\\APPDATA\\Atom\\Python\\Scripts\\test.csv'
entry = "\nneu1,neu2"
with open(file,'a+') as csvfile:
    csvfile.write(entry)
    csvfile.seek(0)
    lines = csvfile.readlines()
    del lines[1]
with open(file, "w") as csvfile:
    for l in lines:
        csvfile.write(l)
merci im voraus

so long
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
__deets__
User
Beiträge: 9655
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 5. Mai 2020, 09:13

Man arbeitet ueblicherweise nicht mit del. Und das erst anhaengen und danach per seek alles einlesen um zu loeschen ist auch von hinten durch die Brust ins Auge. Ich wuerde das so machen:

Code: Alles auswählen

filename = 'E:\\APPDATA\\Atom\\Python\\Scripts\\test.csv'
entry = "\nneu1,neu2"
with open(filename, 'r') as csvfile:
    lines = csvfile.readlines()
    
lines.append(entry)

with open(filename, "w") as csvfile:
    csvfile.writelines(lines[1:])
"Herr Fachmann, wie bohre ich mir ein Loch ins Knie?"

"Das sollten sie nicht tun! Und wenn man operiert, muss man auf Hygiene achten, und nicht einen Bohrer, der gerade in der Wand ein Loch gebohrt hat, nehmen."

"Das war nicht meine fachliche Frage!!"
Sirius3
User
Beiträge: 14403
Registriert: Sonntag 21. Oktober 2012, 17:20

Dienstag 5. Mai 2020, 09:13

Der Filemodus "a+" ist für Text-Dateien eigentlich nie sinnvoll, `seek` macht auch keinen Sinn. Dateien brauchen immer ein Encoding. Das Zeile-Endezeichen sagt shon der Name, steht am Ende einer Zeile, nicht am Anfang

Code: Alles auswählen

filename = 'E:\\APPDATA\\Atom\\Python\\Scripts\\test.csv'
entry = "neu1,neu2\n"
with open(filename, encoding="utf8") as csvfile:
    lines = csvfile.readlines()
del lines[1]
lines.append(entry)
with open(filename, "w", encoding="utf8") as csvfile:
    csvfile.writelines(lines)
Besser wäre es, nicht die selbe Datei zu überschreiben, sondern eine neue Datei anzulegen und zum Schluß diese Datei in den Ursprünglichen Namen umzubenennen.
Noch besser wäre es natürlich, wirklich eine csv-Datei zu lesen und zu schreiben, mit dem csv-Modul.
Antworten