2009-08-21 6 views
14

J'ai écrit un code Python qui va chercher un fichier zip à partir du Web et en une chaîne:Si j'ai le contenu d'un fichier zip dans une chaîne Python, puis-je le décompresser sans l'écrire dans un fichier?

In [1]: zip_contents[0:5] 
Out[1]: 'PK\x03\x04\x14' 

Je vois qu'il ya une bibliothèque zipfile, mais je vais avoir du mal à trouver une fonction dans ce que je peux juste passer un tas de données zip brutes. Il semble vouloir le lire à partir d'un fichier.

Ai-je vraiment besoin de le vider dans un fichier temporaire, ou y a-t-il un moyen de le contourner? Enveloppez votre chaîne dans un objet cStringIO

Répondre

30

zipfile.ZipFile accepte un objet de type fichier, vous pouvez utiliser StringIO (2.x) ou BytesIO (3.x):

try: 
    from cStringIO import StringIO 
except: 
    from StringIO import StringIO 
import zipfile 

fp = StringIO('PK\x03\x04\x14') 
zfp = zipfile.ZipFile(fp, "r") 
6

Il ressemble, agit et charlate comme un objet fichier, mais réside en mémoire.

-1

Une fois que vous avez l'objet zipfile de la réponse de @John Millikin ci-dessus, vous pouvez imprimer le contenu des fichiers contenus dans le zip comme ceci:

file_objects = zfp.infolist() 
contents = [zfp.read(file_object) for file_object in file_objects] 
print(contents) 

vous obtiendrez quelque chose comme ceci:

['Content for file 1', 'Content for file 2'] 

J'ai utilisé ceci dans un test unitaire pour affirmer le contenu du fichier zip.

En outre, StringIO m'a donné l'erreur: initial_value must be unicode or None, not str, donc j'ai utilisé BytesIO à la place.

Questions connexes