PyDay: Pakete auspacken

Bislang war Python ziemlich betriebssystemunabhängig. Was für die Sprache selbst auch weiterhin gilt, erhält natürlich gewisse Einschränkungen immer dann, wenn es “hinaus in die Welt” geht. Ein Beispiel dafür ist die Verwendung von temporären Verzeichnissen oder Dateien.

Weihnachten ist vorbei, aber auch im Laufe des Jahres hat man manchmal die Aufgabe, irgendwelche Pakete auszupacken. Informationen aus einer ZIP-Datei zum Beispiel. Dazu muss man

  • die ZIP-Datei auspacken
  • die entstandenen Dateien durchsuchen
  • die Dateien wieder löschen

Wenn wir mal davon ausgehen, dass keine Änderungen gemacht werden und daher die Dateien nicht wieder eingepackt werden müssen, ist das in Python ziemlich einfach. Allerdings hat jedes Betriebssystem so seine eigenen “Vorstellungen” (i.e. Konventionen), wo temporäre Dateien bitte schön liegen sollten.

Für unsere Aufgabenstellung benutzen wir zwei Bibliotheken: tempfile und zipfile. Mit tempfile beschaffen wir uns ein temporäres Verzeichnis, und mit zipfile packen wir das Archiv in dieses Verzeichnis aus. Ferner sorgen wir dafür, dass das temporäre Verzeichnis wieder gelöscht wird, nachdem wir damit fertig sind. Letzteres geht sogar ohne eine einzige Zeile Code.

from tempfile import TemporaryDirectory
from zipfile import ZipFile
from os import listdir

programmname = 'Mein Programm'
dateiname = 'testdatei.zip'

with TemporaryDirectory(prefix='auspackprogramm-') as temp:
    datei = ZipFile(dateiname) 
    datei.extractall(temp)
    print('Temp. folder: {0}'.format(temp))
    print('Content:      {0}'.format(listdir(temp)))

In Zeile 1 bis 10 steht der Code, der nötig ist, um das obige zu erledigen. Das “with” ist dabei ein sogenannter Context Manager. Sobald das Objekt (in diesem Falle als Variable “temp” übergeben) den Kontext verlässt, wird es automatisch deinstanziert. Das bedeutet im vorliegenden Fall, dass damit auch die ausgepackten Dateien in dem temporären Verzeichnis verschwinden. Jeder Code, der noch etwas mit diesen Dateien machen will, muss also ebenfalls innerhalb des “with” eingerückt stehen. Das habe ich in den Zeilen 11 und 12 mal angedeutet.

Bei Linux werden unsere ZIP-Inhalte also z.B. nach /tmp/auspackprogramm-waf8iim7 geschrieben, während Windows 7 diese im Benutzerverzeichnis ablegt, z.B. C:\Users\USERNAME\AppData\Local\Temp\auspackprogramm-y1o0amyc. Dabei fällt noch eine Besonderheit auf: Das temporäre Verzeichnis wird von der Funktion TemporaryDirectory() zusätzlich um einen zufälligen Namensteil erweitert. Zur Unterscheidung während der Testphase habe ich den Präfix “auspackprogramm-” voranstellen lassen. Dennoch landen keine zwei Aufrufe im selben Verzeichnis.

Das war doch einfach, oder?

Ähnliche Artikel:

Schreibe einen Kommentar

Deine Email-Adresse wird nicht veröffentlicht.

sechs + 16 =