Розпакування файлів у 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.