zipfile: Datei ohne Verzeichnisstruktur entpacken

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
Grendel
User
Beiträge: 50
Registriert: Samstag 19. Dezember 2015, 16:06

Hallo,

gibt es eine elegante Möglichkeit, mittels zipfile eine Datei ohne ihre übergeordnete Verzeichnisstruktur zu entpacken? Nutze ich z.B.

Code: Alles auswählen

zip_members.extract(member)
um nur auf eine komprimierte Datei zuzugreifen, so wird immer das übergeordnete Verzeichnis mit dekomprimiert. Klar, ich könnte die Datei(en) in ein temporäres Verzeichnis entpacken und anschließend nur die Dateien ins Zielverzeichnis kopieren. Das aber erscheint mir nicht sehr elegant.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Grendel: indem man einfach zip_members.open mit shutil.copyfileobj nutzt.
Grendel
User
Beiträge: 50
Registriert: Samstag 19. Dezember 2015, 16:06

Okay, danke. Was genau ist der Unterschied zwischen zip_members.extract und zip_members.open?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Grendel: das steht in der Dokumentation.
BlackJack

Code: Alles auswählen

In [17]: import difflib

In [18]: list(difflib.ndiff('zip_members.extract', 'zip_members.open'))
Out[18]: 
['  z',
 '  i',
 '  p',
 '  _',
 '  m',
 '  e',
 '  m',
 '  b',
 '  e',
 '  r',
 '  s',
 '  .',
 '+ o',
 '+ p',
 '  e',
 '+ n',
 '- x',
 '- t',
 '- r',
 '- a',
 '- c',
 '- t']
SCNR :-)
Grendel
User
Beiträge: 50
Registriert: Samstag 19. Dezember 2015, 16:06

Sirius3 hat geschrieben:@Grendel: das steht in der Dokumentation.
Auf die Idee, in die Doku zu schauen, bin ich ja nun auch schon gekommen. Das hilft nun nicht wirklich, da die Doku, wie eigentlich alle Dokumentationen aller Programmiersprachen, die Kenntnis gewisser, oft sogar sprachenspezifischer, Fachtermini voraussetzt, die man als Neuling nicht unbedingt hat. Ich zitiere mal:

ZipFile.extract(member, path=None, pwd=None)
Extract a member from the archive to the current working directory ...

ZipFile.open(name, mode='r', pwd=None)
Extract a member from the archive as a file-like object (ZipExtFile)

So so, ein file-like object also. Was ist das? Omas Zettelkasten ist auch ein "file-like object", wird aber wohl kaum gemeint sein.
BlackJack

@Grendel: „file-like objekt“ heisst auf Deutsch `file`-ähnliches Objekt. Ebenfalls bei der `open()`-Methode steht der Satz: „The file-like object is read-only and provides the following methods: read(), readline(), readlines(), __iter__(), next().“ Also Methoden die einem allgemein von Dateien in Python bekannt sein sollten. Bietet Oma's Zettelkasten diese Methoden auch? Dann wäre er auch ein „file-like“. Duck typing halt. :-)

Das Du die Dokumentation schon gelesen hast, kann ja keiner Wissen wenn Du das nicht sagst. Darum kommt bei Fragen die von der Dokumentation beantwortet werden, ein Verweis auf eben jene. Wenn Du Die nicht verstehst, dann stell konkrete Fragen was Du daran nicht verstehst. Wenn Du das nicht tust, wissen wir nicht wo das Problem liegt und können es ohne Glaskugel auch nicht angehen.
Antworten