2013-04-07 9 views
9

È possibile creare un oggetto TarFile in memoria utilizzando un buffer contenente i dati tar senza dover scrivere il file TarFile sul disco e aprirlo di nuovo? Otteniamo i byte inviati su un socket.Come costruire un oggetto TarFile in memoria dal buffer di byte in Python 3?

Qualcosa di simile a questo:

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) 

Nota: uno dei motivi per fare questo è che alla fine abbiamo vogliamo essere in grado di fare questo con più thread contemporaneamente, in modo da utilizzare un file temporaneo potrebbe essere sovrascritto se due i thread cercano di farlo allo stesso tempo.

Grazie per qualsiasi aiuto!

risposta

15

BytesIO() da IO module fa esattamente quello che ti serve.

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

potrebbe essere necessario aggiungere la modalità, a seconda di quello che stai facendo (archivio in un archivio) tarfile.open (fileobj = byte_stream, mode = 'r: gz') – Alex

+1

^esattamente. Avevo ottenuto 'fileobj = file_like_object' e non stavo facendo' mode = 'dando solo la modalità che non è valida python x0 (sono tutti argomenti posizionali, ma i documenti mostrano' "nomefile", "r: gz "' - Se usi la memoria dalla memoria devi 'fileobj = ..., mode = ...' esplicitamente! – sjm324

2

Certo, qualcosa di simile:

import io 

io_bytes = io.BytesIO(byte_array) 

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

(Regolare mode per adattare il formato del file tar, ad esempio, forse `mode = 'r: gz', etc.)

Problemi correlati