web-dev-qa-db-fra.com

Extraction du contenu du fichier Zip dans un répertoire spécifique dans Python 2.7

C'est le code que j'utilise actuellement pour extraire un fichier Zip qui réside dans le même répertoire de travail actuel que le script. Comment puis-je spécifier un répertoire différent dans lequel extraire?

Le code que j'ai essayé ne l'extrait pas où je veux.

import zipfile

fh = open('test.Zip', 'rb')
z = zipfile.ZipFile(fh)
for name in z.namelist():
    outfile = open(name, 'wb')
    outfile.write('C:\\'+z.read(name))
    outfile.close()
fh.close()
52
lodkkx

Je pense que vous avez juste une confusion ici. Devrait probablement être quelque chose comme ce qui suit:

import zipfile

fh = open('test.Zip', 'rb')
z = zipfile.ZipFile(fh)
for name in z.namelist():
    outpath = "C:\\"
    z.extract(name, outpath)
fh.close()

et si vous voulez seulement extraire tous les fichiers:

import zipfile

with zipfile.ZipFile('test.Zip', "r") as z:
    z.extractall("C:\\")

Utilisez pip install zipfile36 pour les versions récentes de Python

import zipfile36
105
secretmike

J'ai essayé les autres réponses dans ce fil, mais la solution finale pour moi était simplement:

zfile = zipfile.ZipFile('filename.Zip')
zfile.extractall(optional_target_folder)

Regardez extractible , mais utilisez-le uniquement avec des fichiers Zip dignes de confiance.

11
fiatjaf

Ajout de la réponse de secretmike ci-dessus avec le support de python 2.6 pour extraire tous les fichiers.

import zipfile
import contextlib


with contextlib.closing(zipfile.ZipFile('test.Zip', "r")) as z:
   z.extractall("C:\\")
4
Slakker

Si vous souhaitez simplement extraire un fichier Zip de la ligne de commande en utilisant Python (par exemple, car vous n'avez pas la commande unzip disponible), vous pouvez appeler le module zipfile directement.

python -m zipfile -e monty.Zip target-dir/

Jetez un coup d'œil au docs . Il prend également en charge la compression et la liste du contenu.

3
Peter Gibson

Peter de Rivaz a un point dans le commentaire ci-dessus. Vous allez vouloir avoir le répertoire dans l'appel à open (). Vous allez vouloir faire quelque chose comme ça:

import zipfile
import os

os.mkdir('outdir')
fh = open('test.Zip','rb')
z = zipfile.ZipFile(fh)
for name in z.namelist():
    outfile = open('outdir'+'/'+name, 'wb')
    outfile.write()
    outfile.close()
fh.close()
2
razzmataz

J'ai modifié le code pour demander à l'utilisateur de saisir le nom du fichier et son chemin d'accès où il doit être extrait, etc. l'utilisateur aura plus de contrôle sur l'endroit où placer le dossier extrait et sur le nom à attribuer au dossier extrait.

import zipfile

#picking Zip file from the directory
ZipFileName = raw_input("Enter full path to Zip file:")  
fh = open( ZipFileName , 'rb')
z = zipfile.ZipFile(fh)

#assigning a name to the extracted Zip folder
DestZipFolderName = raw_input("Assign destination folder a name: ")
DestPathName = raw_input("Enter destination directory: ")
DestPath = DestPathName + "\\" + DestZipFolderName

for name in z.namelist():   
    outpath = DestPath
    z.extract(name, outpath)
fh.close()
0
sarfarazit08