Comment lire des fichiers sélectionnés à partir d'une archive Zip distante via HTTP à l'aide de Python?

StackOverflow https://stackoverflow.com/questions/94490

  •  01-07-2019
  •  | 
  •  

Question

Je dois lire les fichiers sélectionnés, en correspondance du nom de fichier, à partir d'une archive zip distante utilisant Python. Je ne veux pas sauvegarder le zip complet dans un fichier temporaire (ce n'est pas si gros, je peux donc tout gérer en mémoire).

J'ai déjà écrit le code et ça marche, et je réponds moi-même pour pouvoir le chercher plus tard. Mais comme les preuves suggèrent que je suis l’un des participants les plus stupides de Stackoverflow, je suis convaincu que des améliorations sont possibles.

Était-ce utile?

La solution

Voici comment je l'ai fait (en récupérant tous les fichiers se terminant par ".ranks"):

import urllib2, cStringIO, zipfile

try:
    remotezip = urllib2.urlopen(url)
    zipinmemory = cStringIO.StringIO(remotezip.read())
    zip = zipfile.ZipFile(zipinmemory)
    for fn in zip.namelist():
        if fn.endswith(".ranks"):
            ranks_data = zip.read(fn)
            for line in ranks_data.split("\n"):
                # do something with each line
except urllib2.HTTPError:
    # handle exception

Autres conseils

Merci Marcel pour votre question et votre réponse (j'ai eu le même problème dans un contexte différent et j'ai rencontré le même problème avec des objets de type fichier qui ne ressemblent pas vraiment à un fichier)! Juste comme une mise à jour: Pour Python 3.0, votre code doit être légèrement modifié:

import urllib.request, io, zipfile

try:
    remotezip = urllib.request.urlopen(url)
    zipinmemory = io.BytesIO(remotezip.read())
    zip = zipfile.ZipFile(zipinmemory)
    for fn in zip.namelist():
        if fn.endswith(".ranks"):
            ranks_data = zip.read(fn)
            for line in ranks_data.split("\n"):
                # do something with each line
except urllib.request.HTTPError:
    # handle exception

Ceci fera le travail sans télécharger le fichier zip complet!

http://pypi.python.org/pypi/pyremotezip

N'oubliez pas que la simple décompression d'un fichier ZIP peut entraîner une vulnérabilité à la sécurité .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top