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

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: 14491
Registriert: Mittwoch 14. Oktober 2015, 14:29

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:])
Sirius3
User
Beiträge: 17709
Registriert: Sonntag 21. Oktober 2012, 17:20

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