Länge Zeilen CSV-Datei ermitteln

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
Tinker232
User
Beiträge: 50
Registriert: Mittwoch 25. Juli 2018, 13:45

Hallo zusammen,

ist es möglich die Länge einer CSV-Datei zu ermitteln in der in gerade hineingeschrieben habe ohne sie zu schließen?

habe bisher mögliche Kommandos ausprobiert wie z.B.

Code: Alles auswählen

sum(1 for line in open(filename))
len(open(filename).readlines())
len(pd.read_csv(filename)) + 1
Allerdings geben diese mir erst einen Wert zurück wenn ich vorher das file schließe, vorher ist es entweder 0 oder not readable!

Code: Alles auswählen

filename.close()
Denn ich möchte an der Stelle prüfen, ob ich schon meine 300 Zeilen voll habe und ein neues File erzeuge oder weiterschreiben kann...
Danke und LG Tina
Benutzeravatar
__blackjack__
User
Beiträge: 14033
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Tinker232: Du könntest die `flush()`-Methode verwenden um eventuell gepufferte Daten auch tatsächlich raus zu schreiben. Und Vorsicht: bei CSV muss die Anzahl der Zeilen nicht der Anzahl der Datensätze entsprechen, weil Zeilenenden auch innerhalb von einzelnen Werten vorkommen dürfen. Wenn man sicher sein will, muss man also Datensätze zählen und nicht (Text)Zeilen.

Wobei mir das recht teuer erscheint jedes mal die gesamte Datei zu verarbeiten um zu testen ob man schon eine bestimmte Anzahl an Datensätzen in der Datei hat. Da würde ich eher am Anfang die Anzahl ermitteln und dann beim schreiben von neuen Datensätzen im Programm mitzählen.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mit Boardmitteln würde ich einfach die Anzahl der Datensätze zählen, die der CSV-Reader liefert:

Code: Alles auswählen

# Entweder (speicherhungrig)
len(list(csv.reader(csv_file)))

# Oder (speicherschonend)
sum(1 for _ in csv.reader(csv_file))
Vor welchem Hintergrund brauchst du diese Angabe denn...?
Tinker232
User
Beiträge: 50
Registriert: Mittwoch 25. Juli 2018, 13:45

Es geht um ein loggerfunktion. Meine Daten werden in eine Queue geschrieben. Sobald diese voll ist wird die Liste entleert und in das file geschrieben, danach soll überprüft werden ob die Dateigröße oder Anzahl der Zellen (je nachdem was einfacherer & effizienter zu lösen ist) einen Wert von X überschritten hat. Wenn dem so ist wird das aktuelle file geschlossen und für die nächsten Daten aus der Queue eine neue .csv erzeugt.

sum(1 for _ in csv.reader(csv_file)) - hat funktioniert. Allerdings bekomme ich hier 66 angezeigt, obwohl es gerade einmal 11 Zeilen sind! mhhhh
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Du müsstest natürlich prüfen, ob die Standardeinstellungen zu deinen Daten passen, also z.B. im Hinblick auf den Spaltentrenner ("," oder ";" oder Leerzeichen, usw). Ansonsten liest er das falsch ein und die Angaben passen dann nicht.

Aber wenn es dir eigentlich nur um die Dateigröße geht, dann genügt ein os.path.getsize(filename).
Tinker232
User
Beiträge: 50
Registriert: Mittwoch 25. Juli 2018, 13:45

Das hatte ich bereits vorher probiert. Das Funktioniert auch erst wenn ich das csv wieder schließe. Vorher hat das File immer den Wert 0 :(
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Na, das wurde ja oben schon erklärt: Daten werden aus Performancegründen nicht unbedingt sofort auf den Datenträger (bzw ins Dateisystem) geschrieben. Das wird einem dann sozusagen erstmal nur "vorgegaukelt". Ein Schließen der Datei führt zum tatsächlichen Schreiben aller Daten. Dies kann man aber auch ohne das Schließen erzwingen, wenn man meine_datei.flush() aufruft. Probier das doch mal aus.
Tinker232
User
Beiträge: 50
Registriert: Mittwoch 25. Juli 2018, 13:45

Ahh super, vielen Dank. So klappt es auch :-)
*closed :-)
Antworten