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

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


person John Howard    schedule 10.08.2010    source источник
comment
Связано: рекурсивная распаковка файлов stackoverflow.com/questions/28339000/ & stackoverflow.com/questions/36285502/   -  person Tung    schedule 26.02.2020
comment
Для извлечения одной строки см. shutil.unpack_archive().   -  person phoenix    schedule 23.12.2020
comment
Ответ @fonini - по состоянию на 2021 год - правильный / лучший: stackoverflow.com/a/64110098/687896   -  person Brandt    schedule 07.06.2021


Ответы (9)


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

Вот и все!

person Rahul    schedule 10.08.2010
comment
что, если содержимое архива .zip одинаково во всех архивах .zip? как переименовать контент перед извлечением? пример: 1.zip 2.zip .. все содержат content.txt: распаковать все как 1content.txt 2content.txt? - person iratzhash; 07.04.2016
comment
@iratzhash Обычно я создаю новый временный каталог для содержимого с помощью tempfile: docs.python.org /3/library/tempfile.html Я распаковываю во временный каталог и перемещаю / систематизирую файлы оттуда. - person Dave Forgac; 12.07.2017
comment
@ 3kstc Я бы from zipfile import ZipFile. При его использовании вам больше не нужно использовать zipfile.ZipFile, и вы можете использовать ZipFile(zip_file_name). - person Debug255; 13.02.2018
comment
@iratzhash Я так понимаю, вы прокомментировали это 1,5 года назад. Но, чтобы другие знали, обычно содержимое в zip-файле доступно только для чтения. Хороший ответ - здесь by bouke - person Debug255; 13.02.2018
comment
спасибо, примечание: нет библиотеки zipfile, нет необходимости устанавливать pip, zipfile уже есть ... - person ntg; 09.04.2019
comment
Я бы добавил: from tempfile import mkdtemp; directory_to_extract_to = mkdtemp() - person Martin Thoma; 31.07.2019

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

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

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

person user1741137    schedule 16.04.2016
comment
ZipFile также работает как менеджер контекста в версии 2.7 или новее: docs.python. org / 2 / library / zipfile.html # zipfile.ZipFile - person FelixEnescu; 22.01.2017
comment
Как работать с docs.python.org/3.6/library/zipfile. html # zipfile.BadZipFile исключение? Как правило, лучше всего использовать try / except с диспетчером контекста (with-statement)? - person SnowOnion; 06.03.2019
comment
zipfile + pathlib = победа. не возражаете, если я немного обновлю ваш ответ? - person Umar.H; 21.01.2020
comment
есть ли причина избегать os.system(f'tar -xvzf {filename}') и вместо этого использовать zip-файл (например, zip = ZipFile('file.zip'); zip.extractall() ) или shutil.unpack_archive(filename, extract_dir)? - person Charlie Parker; 21.01.2021
comment
@CharlieParker Основная причина - портативность. system вызовы зависят от ОС. Например, tar не будет доступен в Windows. - person Fareanor; 18.05.2021

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

zip = ZipFile('file.zip')
zip.extractall()
person Dan Breen    schedule 10.08.2010
comment
Разве вам не нужно указывать место назначения (zip.extractall (destination))? - person asonnenschein; 24.10.2013
comment
Нет, если вы просто распаковываете в тот же каталог, что и zip-файл - person Dan Gayle; 05.12.2013
comment
@DanGayle, похоже, извлекает zip-файл в текущий рабочий каталог, а НЕ в расположение zip-файла - person Brian Leishman; 09.06.2017
comment
для меня ZipFile () не работал, но zipfile.ZipFile () работал - после импорта zipfile - person Agile Bean; 29.09.2018
comment
Вам нужно zip.close() в конце, если вы не используете инструкцию with, как предлагают другие ответы. - person Boris; 22.06.2020

zipfile - это библиотека низкого уровня. Если вам не нужна конкретная информация, которую он предоставляет, вы можете обойтись с помощью shutil функции более высокого уровня make_archive и _ 4_.

make_archive уже описан в этом ответе. Что касается unpack_archive:

import shutil
shutil.unpack_archive(filename, extract_dir)

unpack_archive автоматически определяет формат сжатия по расширению filename (.zip, .tar.gz и т. Д.), Как и make_archive. Кроме того, filename и extract_dir могут быть любыми подобными пути объектами (например, pathlib.Path), начиная с Python 3.7.

person fonini    schedule 28.09.2020
comment
Этот метод не работает, если у zip-файла есть собственное расширение, например (.omt для пакетов проектов OmegaT). Это дает raise ReadError("Unknown archive format '{0}'".format(filename)). - person msoutopico; 04.03.2021
comment
@msoutopico вы можете явно указать формат: shutil.unpack_archive(filename, extract_dir, format) - person fonini; 04.03.2021
comment
Это правильный путь, спасибо! - person Brandt; 07.06.2021

Вы также можете импортировать только 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.

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

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


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: путь к распакованному файлу

person Done Jin    schedule 03.07.2019

from zipfile import ZipFile
ZipFile("YOURZIP.zip").extractall("YOUR_DESTINATION_DIRECTORY")

Каталог, в который вы будете извлекать файлы, не обязательно должен существовать раньше, вы называете его сейчас

YOURZIP.zip - это имя zip-архива, если ваш проект находится в том же каталоге. Если нет, используйте ПУТЬ, то есть: C: //....//YOURZIP.zip.

Подумайте, чтобы избежать / другим / в PATH. Если у вас есть permission denied, попробуйте запустить свой ide (например, Anaconda) от имени администратора

YOUR_DESTINATION_DIRECTORY будет создан в том же каталоге, что и ваш проект.

person Nicoolasens    schedule 02.07.2020
comment
для меня это строго похоже - person Nicoolasens; 25.01.2021

Если вы хотите сделать это в оболочке, а не писать код.

 python3 -m zipfile -e myfiles.zip myfiles/

myfiles.zip - это zip-архив, а myfiles - путь для извлечения файлов.

person Indika K    schedule 05.08.2020
comment
почему бы просто не сделать tar -xvzf path_file в вашем случае? - person Charlie Parker; 21.01.2021
comment
Файлы ZIP не являются файлами tar. Если у вас нет специальной версии tar, которая обрабатывает ZIP-архивы, ваша команда вообще не будет работать. tar с параметром -z обрабатывает сжатые архивы tar (обычно файлы с расширениями .tgz или .tar.gz) - person Perry; 22.01.2021

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, произойдет сбой.

person user3911901    schedule 13.04.2018