zip file Eigenschaften abfragen - nicht deren Inhalt

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
Neandr
User
Beiträge: 4
Registriert: Sonntag 29. Juli 2018, 10:19

Nach dem Anlegen eines zip Archives in Python2 sollen die Eigenschaften (Properties) des zip Archives abgefragt werden.
Es geht nicht um die archivierten einzelnen Files, sondern um die Eigenschaften des Archives selbst.
In Linux können diese mit dem 'Archive Manager' angezeigt werden als:
"Last modified, Archive size, Content size, Compression ratio, Number of files"

Wie bekomme ich diese Angaben innerhalb eines Python Skriptes?
Benutzeravatar
__blackjack__
User
Beiträge: 14135
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Die erstem beiden Informationen bekommst Du über die Metadaten der ZIP-Datei selbst, also mit den passenden Funktionen aus `os.path`, oder über das `pathlib`-Modul, oder beispielsweise das externe `path`-Modul.

Die anderen Informationen musst Du Dir selbst zusammensuchen bzw. ausrechnen. Vom `ZipFile` kannst Du Dir mit der `infolist()`-Methode eine Liste mit `ZipInfo`-Objekten für die enthaltenen Dateien geben lassen. Die Anzahl entspricht der Anzahl der Dateien und für jede Datei kannst Du Originalgrösse und komprimierte Grösse abfragen.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
Neandr
User
Beiträge: 4
Registriert: Sonntag 29. Juli 2018, 10:19

__blackjack__ hat geschrieben: Sonntag 29. Juli 2018, 11:17
Danke für die Antwort, aber mit zB `infolist()` brauche ich dann wieder ganz viel Codezeilen ... und die Fileliste ist in dem Moment nicht wirklich gefragt.


Habe folgenden Weg gefunden, der zumindest die Archiveigenschaften ergibt:

Code: Alles auswählen

import os
bashCommand = "zip -r -v" \
  " " + "./my-extension.zip" \
  " " + "file1 file2 fileN dir1 dir2 dirN" \
  " " + "| grep 'total bytes=' > zip.log"
os.system(bashCommand)
Das ergibt zB

Code: Alles auswählen

total bytes=4876341, compressed=1366333 -> 72% savings
Sicher könnte der bash string direkt am Systemprompt abgesetzt werden, aber der Aufruf soll Teil eines größeren PY Skripts sein.
Benutzeravatar
__blackjack__
User
Beiträge: 14135
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Neandr: Ähm, ja, wenn es Dir um Kürze geht und Du so etwas wie `os.system()` verwenden möchtest, dann schreib halt kein Python sondern ein Shell-Skript.

`bashCommand` würde in Python als `bash_command` oder `BASH_COMMAND` geschrieben werden. Ausser Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase) schreibt man Namen in Python klein_mit_unterstrichen.

Dein Programm setzt eine Shell, ``zip``, und ``grep`` voraus. Und das ``zip`` englische Texte ausgibt, also das System nicht in einer anderen Sprache läuft. Und es verwendet `os.system()` was man nicht tun sollte. Für etwas was man auch mit Python ausdrücken könnte. Sogar ohne zusätzlich etwas installieren zu müssen, nur mit Modulen aus der Standardbibliothek.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
nezzcarth
User
Beiträge: 1778
Registriert: Samstag 16. April 2011, 12:47

Neandr hat geschrieben: Sonntag 29. Juli 2018, 16:51 Danke für die Antwort, aber mit zB `infolist()` brauche ich dann wieder ganz viel Codezeilen ... und die Fileliste ist in dem Moment nicht wirklich gefragt.
Das mag sein, aber das über einen externen Prozess zu lösen, der dann auch noch über einen händisch mit "+" zusammengebauten String gestartet wird, kann (zumindest in Python) keine Lösung sein. Wenn du es unbedingt so machen möchtest, schlage ich vor dir wenigstens mal das subprocess-Modul an zu sehen (https://docs.python.org/2/library/subprocess.html) und 'os.system' zu vergessen.
Neandr
User
Beiträge: 4
Registriert: Sonntag 29. Juli 2018, 10:19

Danke für die Antworten ..
.. auch wenn ich mich damit schwer tue. Nicht so sehr des Inhaltes wegen, sondern die Art der Antworten. Im Gegensatz dazu die Antwort auf Stackoverflow (siehe hier: https://stackoverflow.com/questions/515 ... t#51583910).

Anmerkungen
Die ursprüngliche Frage ist nach den Eigenschaften des ZIP Archivs und da wäre mir mehr als lieb reinen Python Code zu verwenden. Aber offensichtlich gibt es viele Methoden etc zu ZIP, aber halt nicht für die gewünschten Eigenschaften wie: "Last modified, Archive size, Content size, Compression ratio, Number of files"
Abgesehen davon, dass die Erstellung eines ZIPs in Python sehr aufwendig .. sorry flexibel .. ist, lässt sich manches halt auch mit anderen Mitteln viel einfacher realisieren (siehe Bash).
Es wäre schön nicht solche Hinweise wie "... würde in Python als `bash_command` oder `BASH_COMMAND` geschrieben ..." zu bekommen und dann gleichzeitig .. "verwendet `os.system()` was man nicht tun sollte" ohne konstruktiven Hinweis. Und warum " .. händisch mit "+" zusammengebauten String .. , kann (zumindest in Python) keine Lösung sein"? Das bleibt unbeantwortet im Raum stehen.
Um es nochmal zu betonen: die ZIP Erstellung und die Abfrage der Eigenschaften ist Teil eines größeren Python Skripts und 100pro für ein reines Python Skript!

Leider sind mir diese Kommentare (ohne zielführende Hilfe) in diesem deutschen Forum aus der Vergangenheit nicht unbekannt, Schade ... siehe oben Stackoverflow, es geht auch anders.
Sirius3
User
Beiträge: 18299
Registriert: Sonntag 21. Oktober 2012, 17:20

im Gegensatz zu Stackoverflow wird hier nicht zu jedem Problem gleich die Komplettlösung vorgekaut, sondern Hilfe zur Selbsthilfe gegeben, z.B. enthält __blackjack__s erster Kommentar schon alles, was Du zur Lösung brauchst. Das war Dir aber anscheinend zu anstrengend; und Du nimmst lieber den KOSTENLOSEN! Programmierservice von Stackoverflow in Anspruch.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

DU hast doch genau die Antwort, die dir auf SO geliefert wurde selbst ausgeschlossen:

"""
Danke für die Antwort, aber mit zB `infolist()` brauche ich dann wieder ganz viel Codezeilen ... und die Fileliste ist in dem Moment nicht wirklich gefragt.
"""

Das SO fuer das abliefern kompakter Code-Beispiele besser ist, ist sicher richtig. Eine Diskussion darueber, was der richtige Weg denn allgemein ist, kommt da aber eher nicht vor. Da wird eine spekulative oder unpraezise Frage einfach geschlossen, und gut ist.

Aber konzentrier dich auf SO, wenn du da deine Antworten bekommst, ist doch gut.
nezzcarth
User
Beiträge: 1778
Registriert: Samstag 16. April 2011, 12:47

Neandr hat geschrieben: Montag 30. Juli 2018, 17:34 Leider sind mir diese Kommentare (ohne zielführende Hilfe) in diesem deutschen Forum aus der Vergangenheit nicht unbekannt, Schade ... siehe oben Stackoverflow, es geht auch anders.
Umgekehrt sind Rückmeldungen wie diese für diejenigen, die Fragen beantworten -- aus der Motivation heraus, anderen zu helfen --, ebenfalls nicht besonders motivierend.

Du hättest ja zum Beispiel auch einfach fragen können, warum man 'os.system' nicht verwenden sollte, warum es keine gute Idee ist, Befehlszeilenstrings per '+' zusammenzusetzen, oder warum CamelCase in Python unüblich ist, wenn du es bei eigenen Recherchen nicht herausfinden konntest. Ein wichtiger Punkt ist eben, dass es in Python sehr viele Konventionen und Best Practices gibt, die sich bewährt haben und in der Community üblich sind; das zweite Code-Beispiel von Stackoverflow stammt mit einiger Wahrscheinlichkeit von jemandem, der noch nicht viel Python programmiert, oder zumindest wenig fremden Python-Code gelesen hat. 'TIMTOWTDI' ist bei Python explizit nicht angesagt, was für Einsteiger manchmal vielleicht etwas frustrierend sein, wenn sie erst mal aufgelistet bekommen, was sie alles falsch gemacht haben. Allerdings sind das eben die Grundlagen, auf denen alles weitere aufbaut.
Neandr
User
Beiträge: 4
Registriert: Sonntag 29. Juli 2018, 10:19

"Umgekehrt sind Rückmeldungen wie diese für diejenigen, die Fragen beantworten -- aus der Motivation heraus, anderen zu helfen --, nicht besonders motivierend."
Aus eigener Erfahrung beim Betreiben einer Support Page kenne ich das zur Genüge, aber für mich war es immer eher Ansporn zu sehen was der Nutzer "wirklich" braucht.
Wie gesagt in diesem Forum scheint ein anderer Ton gängig zu sein. In dem Sinn: "Nett kann ich auch, bringt auch nix". Das ist was ich als "Schade" bezeichne.
Antworten