.gz Dateigröße 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
nik255
User
Beiträge: 5
Registriert: Montag 25. Februar 2019, 12:05

Guten Tag,

ist es möglich, mehere .gz Dateien einzulesen, die Größe zu Filtern und die Anzahl der gefilterten Daten in eine .txt zu speichern?

Kleines Beispiel wie ich es meine: Ich habe 50 Dateien, alle unterschiedlich groß. Ich möchte jedoch nur die die größer sind als 200kB. Die Dateien die über 200kB groß sind, sollen in einer Text Datei abgespeichert werden.

Hat jemand eventuell ein Lösungsansatz, bin neu bei Python und bin derzeit mit meinem Latein am Ende.

Mit freundlichen Grüßen
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Interessiert dich die entpackte Groesse, oder nur die Groesse der gz-Datei?
nik255
User
Beiträge: 5
Registriert: Montag 25. Februar 2019, 12:05

Nur die gepackte
Benutzeravatar
__blackjack__
User
Beiträge: 14040
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@nik255: Unabhängig wie Du __deets__' Frage beantwortest ist in Python beides möglich. Und eigentlich auch relativ einfach. Wo liegt denn das konkrete Problem? Für die Dateigrösse brauchst Du die Datei nicht einlesen/entpacken, da kann man ja einfach die Metadaten vom Dateisystem erfragen (`os.path`-Modul oder `pathlib`). Ansonsten müsste man die Dateien mit Hilfe des `gzip`-Moduls öffnen und kann dann beispielsweise mit `seek()` ermitteln wie lang die entpackte Datei ist.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
nik255
User
Beiträge: 5
Registriert: Montag 25. Februar 2019, 12:05

Ich habe es mit os.path.getsize(..) versucht, jedoch kommt es da immer zur Fehlermeldung. "Datenträgerbezeichnung ist falsch..".
Wenn ich aber z.B. os.path.exists(..) benutze, funktioniert es alles einwandfrei. Wahrscheinlich übersehe ich gerade einfach irgendwas dummes.
Wie dem auch sei, angenommen getsize() würde funktionieren, wird da nicht die Größe der gesamten Dateien wiedergegeben? Oder kann man auch jede einzelne Datei wiedergeben?
Benutzeravatar
sparrow
User
Beiträge: 4537
Registriert: Freitag 17. April 2009, 10:28

Was sagt denn die Dokumentation der Funktion?

Und zeig doch mal, wie du es versuchst und den kompletten Fehler inklusive Stacktrace.
Benutzeravatar
__blackjack__
User
Beiträge: 14040
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@nik255: Was meinst Du mit die Grösse der gesamten Dateien? `os.path.getsize()` erwartet den Pfad/Namen *einer* Datei.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
nik255
User
Beiträge: 5
Registriert: Montag 25. Februar 2019, 12:05

Okay, ich habe getsize() falsch angewendet. Jetzt benuzte ich folgenden Code:

Code: Alles auswählen

size = sum([os.path.getsize(f) for f in os.listdir('D:\Codes') if os.path.isfile(f)])
Welcher indem Fall auch funktioniert. Wenn ich jedoch den Dateipfad änder, wo alle meine gepackten Dateien drinne sind kommt folgende Meldung:

Bild
Benutzeravatar
sparrow
User
Beiträge: 4537
Registriert: Freitag 17. April 2009, 10:28

Das Ergebnis von os.listdir ist eine Liste mit Dateinamen. os.path.getsize() erwartet aber einen kompletten Pfad + Dateinamen.
Mit os.path.join kannst du Pfade zusammen setzen.
Du musst einen Backslash in einer Zeichenkette mit einem Backslash escapen ( d:\\xxx ) oder du benutzt stattdessen ein "/", den muss man nicht escapen und Python versteht beides.

Übrigens passt dein gezeigter Stacktrace nicht zu deinem Code. Denn der Fehler würde so bei dem Code, den du zeigst, nicht auftreten, weil du dort zufällig kein Excape-Zeichen triffst. Der Fehler wäre also versteckt, bis du einen Verzeichnisnamen erwischt, in dem ein Escapezeichen vorkommt.
nik255
User
Beiträge: 5
Registriert: Montag 25. Februar 2019, 12:05

Nochmal für den besseren Überblick:

Szenario1:

Code: Alles auswählen

size = sum([os.path.getsize(f) for f in os.listdir('D:\Codes') if os.path.isfile(f)])
print (size)
Bild

Szenario2:

Code: Alles auswählen

size = sum([os.path.getsize(f) for f in os.listdir('D:\sandbox\vault\43') if os.path.isfile(f)])
print (size)
Bild


Im Grunde genommen ändert sich nur der Pfad.
Benutzeravatar
sparrow
User
Beiträge: 4537
Registriert: Freitag 17. April 2009, 10:28

Was ist deine konkrete Frage?
Warum der Fehler auftritt und es auch ohne den Fehler nicht funktioniert, habe ich ja beantwortet.
Sirius3
User
Beiträge: 18269
Registriert: Sonntag 21. Oktober 2012, 17:20

Würde man, wie oben schon angesprochen, `pathlib` verwenden, würden solche Probleme erst gar nicht auftreten.

Code: Alles auswählen

size = sum(p.stat().st_size for p in pathlib.Path('...').glob('*.gz'))
Antworten