Розпакування файлів у Python


435

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


Пов'язаний: Розархівація файли рекурсивно stackoverflow.com/questions/28339000 / ... & stackoverflow.com/questions/36285502 / ...
— Tung

Відповіді:


785
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 Я розпаковую до тимчасового каталогу та переміщую / упорядковую файли звідти.
— Дейв Forgac

8
@ 3kstc я б from zipfile import ZipFile. Використовуючи його, вам більше не потрібно користуватися zipfile.ZipFile, а можете використовувати ZipFile(zip_file_name).
— Налагодження255

@iratzhash Я розумію, ви прокоментували 1,5 роки тому. Але так, як інші знають, зазвичай вміст zip-файлу лише для читання. Хороша відповідь тут - «буке»
— Debug255

Вигляд мета ноти, але редакція з листопада 2018 року робить це майже ідентичним ще одній відповіді, яка вже використовувала контекстний менеджер (і посилання на те, що це означає).
— Engineero

304

Якщо ви використовуєте Python 3.2 або новішу версію :

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

Вам не потрібно використовувати close або спробувати це зробити, оскільки він використовує побудову контекстного менеджера .


18
ZipFile також працює в якості контекстного менеджера в 2.7 або пізніших версіях: docs.python.org/2/library/zipfile.html#zipfile.ZipFile
— FelixEnescu

Як боротися з винятком docs.python.org/3.6/library/zipfile.html#zipfile.BadZipFile ? Взагалі, яка найкраща практика використовувати спробу / окрім диспетчера контексту (with-statement)?
— SnowOnion

1
zipfile+ pathlib= виграти. розум, якщо я трохи оновити вашу відповідь
— Datanovice

38

Використовуйте extractallметод, якщо ви використовуєте Python 2.6+

zip = ZipFile('file.zip')
zip.extractall()

Чи не потрібно вказувати пункт призначення (zip.extractall (місце призначення))?
— asonnenschein

3
Не якщо ви просто витягуєте в той самий каталог, що й zipfile
— Dan Gayle

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 .


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

path: распакуйте шлях файлу


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. Якщо папка містить не zzi-файл, вона вийде з ладу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.