2013-04-07 4 views
9

Ist es möglich, ein TarFile-Objekt im Speicher zu erstellen, indem Sie einen Puffer verwenden, der die Tar-Daten enthält, ohne das TarFile auf die Festplatte schreiben zu müssen und es erneut zu öffnen? Wir bekommen die Bytes über einen Socket gesendet.Wie erstellt man ein TarFile-Objekt im Speicher aus Byte-Puffer in Python 3?

Etwas wie folgt aus:

import tarfile 
byte_array = client.read_bytes() 
tar = tarfile.open(byte_array) # how to do this? 
# use "tar" as a regular TarFile object 
for member in tar.getmembers(): 
    f = tar.extractfile(member) 
    print(f) 

Hinweis: einer der Gründe dafür ist, dass wir schließlich in der Lage sein wollen, dass diese gleichzeitig mit mehreren Threads zu tun, also eine temporäre Datei mit möglicherweise außer Kraft gesetzt werden, wenn zwei Threads versuchen es gleichzeitig.

Vielen Dank für jede Hilfe!

Antwort

15

BytesIO() von IO module macht genau das, was Sie brauchen.

import tarfile, io 
byte_array = client.read_bytes() 
file_like_object = io.BytesIO(byte_array) 
tar = tarfile.open(fileobj=file_like_object) 
# use "tar" as a regular TarFile object 
for member in tar.getmembers(): 
    f = tar.extractfile(member) 
    print(f) 
+1

könnte der Modus hinzufügen, je nachdem, was Sie tun (Archiv in einem Archiv) tarfile.open (fileobj = byte_stream, mode = 'r: gz') – Alex

+1

^genau. Ich war zu 'fileobj = file_like_object' gekommen und machte' mode = 'nicht einfach den Modus, der nicht gültig ist python x0 (sie sind alle Positionsargumente, aber die Dokumente zeigen' "filename", "r: gz "' - Wenn Sie Sachen aus dem Speicher verwenden, müssen Sie 'fileobj = ..., mode = ...' explizit! – sjm324

2

Sicher, so etwas wie diese:

import io 

io_bytes = io.BytesIO(byte_array) 

tar = tarfile.open(fileobj=io_bytes, mode='r') 

(mode Passen Sie das Format der TAR-Datei zu passen, zum Beispiel möglicherweise `mode = 'r: gz', etc.)

Verwandte Themen