Seite 1 von 1

Länge Zeilen CSV-Datei ermitteln

Verfasst: Donnerstag 25. Oktober 2018, 11:36
von Tinker232
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

Re: Länge Zeilen CSV-Datei ermitteln

Verfasst: Donnerstag 25. Oktober 2018, 11:49
von __blackjack__
@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.

Re: Länge Zeilen CSV-Datei ermitteln

Verfasst: Donnerstag 25. Oktober 2018, 11:59
von snafu
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...?

Re: Länge Zeilen CSV-Datei ermitteln

Verfasst: Donnerstag 25. Oktober 2018, 12:15
von Tinker232
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

Re: Länge Zeilen CSV-Datei ermitteln

Verfasst: Donnerstag 25. Oktober 2018, 12:29
von snafu
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).

Re: Länge Zeilen CSV-Datei ermitteln

Verfasst: Donnerstag 25. Oktober 2018, 12:31
von Tinker232
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 :(

Re: Länge Zeilen CSV-Datei ermitteln

Verfasst: Donnerstag 25. Oktober 2018, 12:37
von snafu
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.

Re: Länge Zeilen CSV-Datei ermitteln

Verfasst: Donnerstag 25. Oktober 2018, 12:46
von Tinker232
Ahh super, vielen Dank. So klappt es auch :-)
*closed :-)