Giải nén tệp trong Python


Câu trả lời:


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

Nó khá là nhiều!


7
Điều gì xảy ra nếu nội dung của kho lưu trữ .zip giống nhau, trong tất cả các tệp lưu trữ .zip? Làm thế nào để đổi tên nội dung trước khi giải nén? ví dụ: 1.zip 2.zip .. tất cả đều chứa content.txt: giải nén tất cả như 1content.txt 2content.txt?
iratzhash

8
@iratzhash tôi thường tạo ra một thư mục mới tạm thời về nội dung sử dụng tempfile: docs.python.org/3/library/tempfile.html tôi giải nén vào thư mục tạm thời và di chuyển / tổ chức các tập tin từ đó.
Dave Forgac

8
@ 3kstc tôi xin from zipfile import ZipFile. Khi sử dụng nó, bạn không còn cần phải sử dụng zipfile.ZipFile, và có thể sử dụng ZipFile(zip_file_name).
Debug255

@iratzhash Tôi nhận ra bạn đã bình luận 1,5 năm trước. Nhưng chỉ để những người khác biết, thông thường nội dung trong tệp zip là chỉ đọc. Một câu trả lời hay có ở đây bởi "bouke"
Debug255

Một loại ghi chú meta, nhưng bản chỉnh sửa từ tháng 11 năm 2018 làm cho điều này khá giống với một câu trả lời khác đã sử dụng trình quản lý bối cảnh (và liên kết đến điều đó có nghĩa là gì).
Engineero

304

Nếu bạn đang sử dụng Python 3.2 trở lên:

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

Bạn không cần phải sử dụng đóng hoặc thử / bắt với điều này vì nó sử dụng cấu trúc trình quản lý bối cảnh .


18
ZipFile cũng hoạt động như một người quản lý bối cảnh trong 2,7 hoặc sau này: docs.python.org/2/library/zipfile.html#zipfile.ZipFile
FelixEnescu

Làm thế nào để đối phó với ngoại lệ docs.python.org/3.6/l Library / zipfile.html#zipfile.BadZipFile ? Nói chung, cách tốt nhất để sử dụng thử / ngoại trừ với trình quản lý bối cảnh (có câu lệnh) là gì?
SnowOnion

1
zipfile+ pathlib= thắng. phiền nếu tôi cập nhật một chút câu trả lời của bạn?
Datanovice

38

Sử dụng extractallphương thức, nếu bạn đang sử dụng Python 2.6+

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

Bạn không phải chỉ định đích (zip.extractall (đích))?
asonnenschein

3
Không phải nếu bạn chỉ trích xuất vào cùng thư mục với zipfile
Dan Gayle

10
@DanGayle điều này dường như trích xuất tệp zip vào thư mục làm việc hiện tại, KHÔNG phải là vị trí của tệp zip
Brian Leishman

4
đối với tôi, ZipFile () không hoạt động nhưng zipfile.ZipFile () đã làm - sau khi nhập zipfile
Agile Bean

6

Bạn cũng chỉ có thể nhập ZipFile:

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

Hoạt động trong Python 2Python 3 .


1
Cảm ơn bạn đã chú ý @MylesHollowed Tuy nhiên, đây không phải là bản sao từ câu trả lời được chấp nhận. Tôi đồng ý rằng chúng tương tự nhau, nhưng chúng khác nhau. Điều này cũng được biểu thị bằng nhận xét của bạn, bởi vì người được chấp nhận chắc chắn tốt cho bạn hơn tôi. Nếu đó là một bản sao, nó sẽ giống nhau ... Đối với ai đó, câu trả lời của tôi có thể có giá trị bởi vì nó có thể dễ đọc hơn và vì bạn nhận thấy nhập ít mã hơn ... Chính vì những khác biệt này mà tôi đã quyết định đặt câu trả lời của mình để đưa ra một sự thay thế. Đó không phải là lý do tại sao chúng ta có thể đưa ra câu trả lời khác sau khi chấp nhận? Tất cả những điều tốt nhất
simhumileco

Có gì sai với câu trả lời này? Tại sao ai đó cho cô ấy một điểm tiêu cực? Rốt cuộc, nó là câu trả lời cho câu hỏi và được phân biệt bởi sự đơn giản của nó so với các câu trả lời khác, điều này có thể quan trọng đối với một số người đang tìm kiếm một câu trả lời. Phải không?
simhumileco

1
@MylesHollowed import zipfile.ZipFiletạo ModuleNotFoundError: No module named 'zipfile.ZipFile'; 'zipfile' is not a packagetrong 3.6.5. Về phần tôi, tôi nhận thấy đó là lỗi của nhà điều hành, nhưng tôi không biết đó là gì.
MikeF

6

thử cái này :


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

đường dẫn: giải nén đường dẫn của tập tin


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)

Điều này không chứa xác nhận cho tập tin nếu nó không phải là zip. Nếu thư mục chứa tệp không .zip thì nó sẽ thất bại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.