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?
zip file Eigenschaften abfragen - nicht deren Inhalt
- __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.
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
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)
Code: Alles auswählen
total bytes=4876341, compressed=1366333 -> 72% savings
- __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.
`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
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 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.
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.
.. 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.
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.
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.
"""
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.
Umgekehrt sind Rückmeldungen wie diese für diejenigen, die Fragen beantworten -- aus der Motivation heraus, anderen zu helfen --, ebenfalls nicht besonders motivierend.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.
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.
"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.
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.