Распаковка файлов в Python

435

Я прочитал zipfileдокументацию , но не мог понять, как разархивировать файл, только как заархивировать файл. Как мне разархивировать все содержимое zip-файла в один и тот же каталог?

Джон Говард
источник
Связанный: рекурсивное разархивирование файлов stackoverflow.com/questions/28339000/… & stackoverflow.com/questions/36285502/…
Tung

Ответы:

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

Вот и все!

Рахул
источник
7
Что делать, если содержимое архива .zip одинаково во всех архивах .zip? как переименовать контент перед извлечением? пример: 1.zip 2.zip .. все содержат content.txt: извлечь все как 1content.txt 2content.txt?
иратжаш
8
@iratzhash Я обычно создаю новый временный каталог для содержимого, используя tempfile: docs.python.org/3/library/tempfile.html Я распаковываю во временный каталог и перемещаю / организую файлы оттуда.
Дэйв Форгак
8
@ 3kstc Я бы from zipfile import ZipFile. При его использовании вам больше не нужно использовать zipfile.ZipFile, и вы можете использовать ZipFile(zip_file_name).
Debug255
@iratzhash Я понимаю, что вы прокомментировали 1,5 года назад. Но другие знают, что обычно содержимое zip-файла доступно только для чтения. Хороший ответ здесь - "bouke"
Debug255
Вроде мета-заметки, но редактирование от ноября 2018 года делает это в значительной степени идентичным другому ответу, который уже использовал менеджер контекста (и ссылки на то, что это значит).
Engineero
304

Если вы используете Python 3.2 или более позднюю версию:

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

Вам не нужно использовать close или try / catch с этим, поскольку он использует конструкцию менеджера контекста .

user1741137
источник
18
ZipFile также работает как менеджер контекста в версии
FelixEnescu
Как бороться с docs.python.org/3.6/library/zipfile.html#zipfile.BadZipFile исключением? Вообще, как лучше использовать try /, кроме как с менеджером контекста (with-Statement)?
SnowOnion
1
zipfile+ pathlib= победа. возражаешь, если я немного обновлю твой ответ?
Датановице
39

Используйте extractallметод, если вы используете Python 2.6+

zip = ZipFile('file.zip')
zip.extractall()
Дэн Брин
источник
Вам не нужно указывать пункт назначения (zip.extractall (destination))?
asonnenschein
3
Нет, если вы просто распаковываете в тот же каталог, что и zip-файл
Дэн Гейл,
10
@DanGayle, по-видимому, извлекает zip-файл в текущий рабочий каталог, а НЕ в расположение zip-файла
Брайан Лейшман,
4
для меня ZipFile () не работал, но zipfile.ZipFile () сделал - после импорта zipfile
Agile Bean
6

Вы также можете импортировать только ZipFile:

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

Работает в Python 2 и Python 3 .

simhumileco
источник
1
Спасибо за ваше внимание @MylesHollowed Однако это не копия принятого ответа. Я согласен, что они похожи друг на друга, но они разные. На это также указывает ваш комментарий, потому что принятый, безусловно, лучше для вас, чем мой. Если бы это была копия, это было бы то же самое ... Для кого-то мой ответ может быть ценным, потому что он, возможно, более читабелен и, как вы заметили, импортирует меньше кода ... Именно из-за этих различий я решил поставить свой ответ дать альтернативу. Разве не поэтому мы можем ставить другие ответы после их принятия? Всего наилучшего
simhumileco
Что не так с этим ответом? Почему кто-то дал ей отрицательный балл? В конце концов, это ответ на вопрос и отличается своей простотой по сравнению с другими ответами, что может быть важно для некоторых людей, которые ищут ответ. Не так ли?
simhumileco
1
@MylesHollowed import zipfile.ZipFileгенерирует ModuleNotFoundError: No module named 'zipfile.ZipFile'; 'zipfile' is not a packageв 3.6.5. Я открыт для того, чтобы быть ошибкой оператора с моей стороны, но я не знаю, что это такое.
MikeF
6

попробуй это :


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() 

путь: распаковать путь к файлу

Готово, Джин
источник
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)

Это не содержит проверки файла, если это не zip. Если папка содержит не ZIP-файл, это не удастся.

user3911901
источник