Descompactando arquivos em Python

Respostas:

787
import zipfile
with zipfile.ZipFile(path_to_zip_file, 'r') as zip_ref:
    zip_ref.extractall(directory_to_extract_to)

É isso mesmo!

Rahul
fonte
7
e se o conteúdo do arquivo .zip for o mesmo, em todos os arquivos .zip? como renomear o conteúdo antes de extrair? exemplo: 1.zip 2.zip .. todos contêm content.txt: extraem todos como 1content.txt 2content.txt?
iratzhash
8
@iratzhash Normalmente, crio um novo diretório temporário para o conteúdo usando tempfile : docs.python.org/3/library/tempfile.html Descompacte o arquivo no diretório temporário e movo / organize os arquivos a partir daí.
Dave Forgac
8
@ 3kstc eu faria from zipfile import ZipFile. Ao usá-lo, você não precisa mais usar zipfile.ZipFilee pode usá-lo ZipFile(zip_file_name).
Debug255
@iratzhash Sei que você comentou 1,5 anos atrás. Mas para que outros saibam, geralmente o conteúdo de um arquivo zip é somente leitura. Uma boa resposta é aqui por "Bouke"
Debug255
Uma espécie de meta nota, mas a edição de novembro de 2018 torna isso praticamente idêntico a outra resposta que já usava o gerenciador de contexto (e vincula o que isso significa).
Engineero
304

Se você estiver usando o Python 3.2 ou posterior:

import zipfile
with zipfile.ZipFile("file.zip","r") as zip_ref:
    zip_ref.extractall("targetdir")

Você não precisa usar o fechamento ou tentar / capturar com isso, pois ele usa a construção do gerenciador de contexto .

user1741137
fonte
18
O ZipFile também funciona como um gerenciador de contexto na versão
FelixEnescu
Como lidar com a exceção docs.python.org/3.6/library/zipfile.html#zipfile.BadZipFile ? Geralmente, qual é a melhor prática para usar try / except com o gerenciador de contexto (com declaração)?
SnowOnion 6/03/19
1
zipfile+ pathlib= vitória. importa se eu atualizar ligeiramente a sua resposta?
Datanovice 21/01
38

Use o extractallmétodo, se você estiver usando o Python 2.6 ou superior

zip = ZipFile('file.zip')
zip.extractall()
Dan Breen
fonte
Você não precisa especificar um destino (zip.extractall (destination))?
asonnenschein
3
Não, se você está apenas extraindo no mesmo diretório do arquivo zip
Dan Gayle
10
@DanGayle este parece ser extrair o arquivo zip no diretório atual de trabalho, não o local do arquivo zip
Brian Leishman
4
para mim, ZipFile () não funcionou, mas zipfile.ZipFile () fez - após zipfile importação
Agile Feijão
6

Você também pode importar apenas ZipFile:

from zipfile import ZipFile
zf = ZipFile('path_to_file/file.zip', 'r')
zf.extractall('path_to_extract_folder')
zf.close()

Funciona em Python 2 e Python 3 .

simhumileco
fonte
1
Obrigado por sua atenção @MylesHollowed No entanto, esta não é uma cópia da resposta aceita. Eu concordo que eles são semelhantes um ao outro, mas são diferentes. Isso também é indicado pelo seu comentário, porque o aceito é definitivamente melhor para você do que o meu. Se fosse uma cópia, seria a mesma ... Para alguém, minha resposta pode ser valiosa porque talvez seja mais legível e como você notou importar menos código ... É por causa dessas diferenças que eu decidi colocar minha resposta para dar uma alternativa. Não é por isso que podemos colocar outras respostas depois de aceitar uma? Tudo de bom
simhumileco 30/10
O que há de errado com esta resposta? Por que alguém lhe deu um ponto negativo? Afinal, é a resposta para a pergunta e se distingue por sua simplicidade em comparação com outras respostas, o que pode ser importante para algumas pessoas que procuram uma resposta. Não é?
simhumileco 28/01
1
O @MylesHollowed import zipfile.ZipFilegera ModuleNotFoundError: No module named 'zipfile.ZipFile'; 'zipfile' is not a packagena 3.6.5. Estou aberto a ser um erro de operador da minha parte, mas não sei o que é.
MikeF 26/02
6

tente isto:


import zipfile
def un_zipFiles(path):
    files=os.listdir(path)
    for file in files:
        if file.endswith('.zip'):
            filePath=path+'/'+file
            zip_file = zipfile.ZipFile(filePath)
            for names in zip_file.namelist():
                zip_file.extract(names,path)
            zip_file.close() 

path: descompacta o caminho do arquivo

Feito Jin
fonte
3
import os 
zip_file_path = "C:\AA\BB"
file_list = os.listdir(path)
abs_path = []
for a in file_list:
    x = zip_file_path+'\\'+a
    print x
    abs_path.append(x)
for f in abs_path:
    zip=zipfile.ZipFile(f)
    zip.extractall(zip_file_path)

Isso não contém validação para o arquivo, se não for zip. Se a pasta contiver arquivo não zip, ela falhará.

user3911901
fonte