Seite 1 von 1

geht's auch smarter ?

Verfasst: Dienstag 5. Mai 2020, 08:57
von Perlchamp
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

Re: geht's auch smarter ?

Verfasst: Dienstag 5. Mai 2020, 09:13
von __deets__
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:])

Re: geht's auch smarter ?

Verfasst: Dienstag 5. Mai 2020, 09:13
von Sirius3
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.