zipfile --- Làm việc với kho lưu trữ ZIP

Source code: Lib/zipfile/


Định dạng tệp ZIP là một tiêu chuẩn nén và lưu trữ phổ biến. Mô-đun này cung cấp các công cụ để tạo, đọc, ghi, nối thêm và liệt kê tệp ZIP. Bất kỳ việc sử dụng nâng cao nào của mô-đun này sẽ yêu cầu hiểu biết về định dạng, như được xác định trong PKZIP Application Note.

Mô-đun này không xử lý các tệp ZIP nhiều phần. Nó có thể xử lý các tệp ZIP sử dụng phần mở rộng ZIP64 (tức là các tệp ZIP có kích thước lớn hơn 4 GiB). Nó hỗ trợ giải mã các tệp được mã hóa trong kho lưu trữ ZIP, nhưng nó không thể tạo tệp được mã hóa. Quá trình giải mã cực kỳ chậm vì nó được triển khai bằng Python nguyên gốc thay vì C.

Xử lý các kho lưu trữ nén yêu cầu optional modules như zlib, bz2, lzmacompression.zstd. Nếu bất kỳ phần nào trong số đó bị thiếu trong bản sao CPython của bạn, hãy tìm tài liệu từ nhà phân phối của bạn (nghĩa là bất kỳ ai đã cung cấp Python cho bạn). Nếu bạn là nhà phân phối, hãy xem Yêu cầu đối với các mô-đun tùy chọn.

Mô-đun xác định các mục sau:

exception zipfile.BadZipFile

Lỗi xảy ra đối với các tệp ZIP xấu.

Added in version 3.2.

exception zipfile.BadZipfile

Bí danh của BadZipFile, để tương thích với các phiên bản Python cũ hơn.

Sắp loại bỏ từ phiên bản 3.2.

exception zipfile.LargeZipFile

Lỗi xảy ra khi tệp ZIP yêu cầu chức năng ZIP64 nhưng chức năng đó chưa được bật.

class zipfile.ZipFile

Lớp đọc và ghi file ZIP. Xem phần Đối tượng ZipFile để biết chi tiết về hàm tạo.

class zipfile.Path

Lớp triển khai một tập hợp con của giao diện do pathlib.Path cung cấp, bao gồm giao diện importlib.resources.abc.Traversable đầy đủ.

Added in version 3.8.

class zipfile.PyZipFile

Lớp tạo kho lưu trữ ZIP chứa thư viện Python.

class zipfile.ZipInfo(filename='NoName', date_time=(1980, 1, 1, 0, 0, 0))

Lớp được sử dụng để thể hiện thông tin về một thành viên của kho lưu trữ. Các thể hiện của lớp này được trả về bằng các phương thức getinfo()infolist() của các đối tượng ZipFile. Hầu hết người dùng mô-đun zipfile sẽ không cần tạo những thứ này mà chỉ sử dụng những thứ được tạo bởi mô-đun này. filename phải là tên đầy đủ của thành viên lưu trữ và date_time phải là một bộ dữ liệu chứa sáu trường mô tả thời gian sửa đổi cuối cùng đối với tệp; các trường được mô tả trong phần Đối tượng ZipInfo.

Thay đổi trong phiên bản 3.13: Một thuộc tính compress_level công khai đã được thêm vào để hiển thị _compresslevel được bảo vệ trước đó. Tên được bảo vệ cũ hơn tiếp tục hoạt động như một thuộc tính để tương thích ngược.

_for_archive(archive)

Giải quyết date_time, thuộc tính nén và thuộc tính bên ngoài thành các giá trị mặc định phù hợp như ZipFile.writestr() sử dụng.

Tự trả về cho chuỗi.

Added in version 3.14.

zipfile.is_zipfile(filename)

Trả về True nếu filename là tệp ZIP hợp lệ dựa trên số ma thuật của nó, nếu không thì trả về False. filename cũng có thể là một tệp hoặc đối tượng giống như tệp.

Thay đổi trong phiên bản 3.1: Hỗ trợ tập tin và các đối tượng giống như tập tin.

zipfile.ZIP_STORED

Hằng số cho thành viên lưu trữ không nén.

zipfile.ZIP_DEFLATED

Hằng số cho phương pháp nén ZIP thông thường. Điều này yêu cầu mô-đun zlib.

zipfile.ZIP_BZIP2

Hằng số cho phương pháp nén BZIP2. Điều này yêu cầu mô-đun bz2.

Added in version 3.3.

zipfile.ZIP_LZMA

Hằng số cho phương pháp nén LZMA. Điều này yêu cầu mô-đun lzma.

Added in version 3.3.

zipfile.ZIP_ZSTANDARD

Hằng số cho nén Zstandard. Điều này yêu cầu mô-đun compression.zstd.

Ghi chú

Trong APPNOTE 6.3.7, ID phương thức 20 được gán cho nén Zstandard. Điều này đã được thay đổi trong APPNOTE 6.3.8 thành ID phương thức 93 để tránh xung đột, trong đó ID phương thức 20 không được dùng nữa. Để tương thích, mô-đun zipfile đọc cả hai ID phương thức nhưng sẽ chỉ ghi dữ liệu với ID phương thức 93.

Added in version 3.14.

Ghi chú

Đặc tả định dạng tệp ZIP đã bao gồm hỗ trợ nén bzip2 từ năm 2001, nén LZMA từ năm 2006 và nén Zstandard từ năm 2020. Tuy nhiên, một số công cụ (bao gồm cả các bản phát hành Python cũ hơn) không hỗ trợ các phương pháp nén này và có thể từ chối xử lý hoàn toàn tệp ZIP hoặc không trích xuất được các tệp riêng lẻ.

Xem thêm

PKZIP Application Note

Tài liệu về định dạng tệp ZIP của Phil Katz, người tạo ra định dạng và thuật toán được sử dụng.

Info-ZIP Home Page

Thông tin về các chương trình lưu trữ và thư viện phát triển ZIP của dự án Info-ZIP.

Đối tượng ZipFile

class zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, *, strict_timestamps=True, metadata_encoding=None)

Mở tệp ZIP, trong đó file có thể là đường dẫn đến tệp (chuỗi), đối tượng giống tệp hoặc path-like object.

Tham số mode phải là 'r' để đọc tệp hiện có, 'w' để cắt bớt và ghi tệp mới, 'a' để nối vào tệp hiện có hoặc 'x' để tạo và ghi riêng một tệp mới. Nếu mode'x'file đề cập đến một tệp hiện có thì FileExistsError sẽ được nâng lên. Nếu mode'a'file đề cập đến tệp ZIP hiện có thì các tệp bổ sung sẽ được thêm vào tệp đó. Nếu file không đề cập đến tệp ZIP thì kho lưu trữ ZIP mới sẽ được thêm vào tệp. Điều này nhằm mục đích thêm kho lưu trữ ZIP vào một tệp khác (chẳng hạn như python.exe). Nếu mode'a' và tệp hoàn toàn không tồn tại thì nó sẽ được tạo. Nếu mode'r' hoặc 'a' thì tệp đó có thể tìm kiếm được.

compression là phương pháp nén ZIP để sử dụng khi ghi tệp lưu trữ và phải là ZIP_STORED, ZIP_DEFLATED, ZIP_BZIP2, ZIP_LZMA hoặc ZIP_ZSTANDARD; các giá trị không được nhận dạng sẽ khiến NotImplementedError tăng lên. Nếu ZIP_DEFLATED, ZIP_BZIP2, ZIP_LZMA hoặc ZIP_ZSTANDARD được chỉ định nhưng mô-đun tương ứng (zlib, bz2, lzma hoặc compression.zstd) không khả dụng, RuntimeError sẽ được nâng lên. Mặc định là ZIP_STORED.

Nếu allowZip64True (mặc định) zipfile sẽ tạo các tệp ZIP sử dụng phần mở rộng ZIP64 khi zipfile lớn hơn 4 GiB. Nếu là false zipfile sẽ đưa ra một ngoại lệ khi tệp ZIP yêu cầu phần mở rộng ZIP64.

Tham số compresslevel kiểm soát mức độ nén sẽ sử dụng khi ghi tệp vào kho lưu trữ. Khi sử dụng ZIP_STORED hoặc ZIP_LZMA thì không có tác dụng. Khi sử dụng số nguyên ZIP_DEFLATED, số nguyên 0 đến 9 được chấp nhận (xem zlib để biết thêm thông tin). Khi sử dụng số nguyên ZIP_BZIP2, số nguyên 1 đến 9 được chấp nhận (xem bz2 để biết thêm thông tin). Khi sử dụng số nguyên ZIP_ZSTANDARD, các số nguyên -131072 đến 22 thường được chấp nhận (xem CompressionParameter.compression_level để biết thêm về cách truy xuất các giá trị hợp lệ và ý nghĩa của chúng).

Đối số strict_timestamps, khi được đặt thành False, cho phép nén các tệp cũ hơn 1980-01-01 với chi phí đặt dấu thời gian thành 1980-01-01. Hành vi tương tự xảy ra với các tệp mới hơn 2107-12-31, dấu thời gian cũng được đặt ở mức giới hạn.

Khi chế độ là 'r', metadata_encoding có thể được đặt thành tên của codec, codec này sẽ được sử dụng để giải mã siêu dữ liệu như tên của các thành viên và nhận xét ZIP.

Nếu tệp được tạo ở chế độ 'w', 'x' hoặc 'a', sau đó là closed mà không thêm bất kỳ tệp nào vào kho lưu trữ, thì cấu trúc ZIP thích hợp cho kho lưu trữ trống sẽ được ghi vào tệp.

ZipFile cũng là một trình quản lý ngữ cảnh và do đó hỗ trợ câu lệnh with. Trong ví dụ này, myzip bị đóng sau khi bộ câu lệnh with kết thúc---ngay cả khi xảy ra ngoại lệ:

với ZipFile('spam.zip', 'w')  myzip:
    myzip.write('eggs.txt')

Ghi chú

metadata_encoding là cài đặt toàn phiên bản cho ZipFile. Không thể thiết lập điều này trên cơ sở từng thành viên.

Thuộc tính này là giải pháp thay thế cho các triển khai cũ tạo ra các kho lưu trữ có tên trong trang mã hoặc mã hóa ngôn ngữ hiện tại (chủ yếu trên Windows). Theo tiêu chuẩn .ZIP, mã hóa siêu dữ liệu có thể được chỉ định là trang mã IBM (mặc định) hoặc UTF-8 bằng cờ trong tiêu đề lưu trữ. Cờ đó được ưu tiên hơn metadata_encoding, đây là một tiện ích mở rộng dành riêng cho Python.

Thay đổi trong phiên bản 3.2: Đã thêm khả năng sử dụng ZipFile làm trình quản lý bối cảnh.

Thay đổi trong phiên bản 3.3: Đã thêm hỗ trợ nén bzip2lzma.

Thay đổi trong phiên bản 3.4: Tiện ích mở rộng ZIP64 được bật theo mặc định.

Thay đổi trong phiên bản 3.5: Đã thêm hỗ trợ ghi vào các luồng không thể tìm kiếm được. Đã thêm hỗ trợ cho chế độ 'x'.

Thay đổi trong phiên bản 3.6: Trước đây, một RuntimeError đơn giản đã được nâng lên cho các giá trị nén không được nhận dạng.

Thay đổi trong phiên bản 3.6.2: Tham số file chấp nhận path-like object.

Thay đổi trong phiên bản 3.7: Thêm tham số compresslevel.

Thay đổi trong phiên bản 3.8: Tham số chỉ có từ khóa strict_timestamps.

Thay đổi trong phiên bản 3.11: Đã thêm hỗ trợ chỉ định mã hóa tên thành viên để đọc siêu dữ liệu trong thư mục và tiêu đề tệp của tệp zip.

ZipFile.close()

Đóng tập tin lưu trữ. Bạn phải gọi close() trước khi thoát khỏi chương trình, nếu không các bản ghi cần thiết sẽ không được ghi.

ZipFile.getinfo(name)

Trả về đối tượng ZipInfo với thông tin về thành viên lưu trữ name. Gọi getinfo() cho một tên hiện không có trong kho lưu trữ sẽ tạo ra KeyError.

ZipFile.infolist()

Trả về danh sách chứa đối tượng ZipInfo cho mỗi thành viên của kho lưu trữ. Các đối tượng có cùng thứ tự với các mục nhập của chúng trong tệp ZIP thực tế trên đĩa nếu kho lưu trữ hiện có được mở.

ZipFile.namelist()

Trả về danh sách các thành viên lưu trữ theo tên.

ZipFile.open(name, mode='r', pwd=None, *, force_zip64=False)

Truy cập một thành viên của kho lưu trữ dưới dạng đối tượng giống như tệp nhị phân. name có thể là tên của tệp trong kho lưu trữ hoặc đối tượng ZipInfo. Tham số mode, nếu được bao gồm, phải là 'r' (mặc định) hoặc 'w'. pwd là mật khẩu được sử dụng để giải mã các tệp ZIP được mã hóa dưới dạng đối tượng bytes.

open() cũng là một trình quản lý bối cảnh và do đó hỗ trợ câu lệnh with

với ZipFile('spam.zip')  myzip:
    với myzip.open('eggs.txt')  myfile:
        in(myfile.read())

Với mode 'r', đối tượng giống tệp (ZipExtFile) ở chế độ chỉ đọc và cung cấp các phương thức sau: read(), readline(), readlines(), seek(), tell(), __iter__(), __next__(). Các đối tượng này có thể hoạt động độc lập với ZipFile.

Với mode='w', một trình xử lý tệp có thể ghi được trả về, hỗ trợ phương thức write(). Trong khi phần xử lý tệp có thể ghi đang mở, việc cố gắng đọc hoặc ghi các tệp khác trong tệp ZIP sẽ tạo ra lỗi ValueError.

Trong cả hai trường hợp, đối tượng giống tệp cũng có các thuộc tính name, tương đương với tên của tệp trong kho lưu trữ và mode, là 'rb' hoặc 'wb' tùy thuộc vào chế độ đầu vào.

Khi ghi tệp, nếu không biết trước kích thước tệp nhưng có thể vượt quá 2 GiB, hãy chuyển force_zip64=True để đảm bảo rằng định dạng tiêu đề có khả năng hỗ trợ các tệp lớn. Nếu biết trước kích thước tệp, hãy tạo đối tượng ZipInfo với tập hợp file_size và sử dụng đối tượng đó làm tham số name.

Ghi chú

Các phương thức open(), read()extract() có thể lấy tên tệp hoặc đối tượng ZipInfo. Bạn sẽ đánh giá cao điều này khi cố đọc tệp ZIP chứa các thành viên có tên trùng lặp.

Thay đổi trong phiên bản 3.6: Đã xóa hỗ trợ của mode='U'. Sử dụng io.TextIOWrapper để đọc tệp văn bản nén ở chế độ universal newlines.

Thay đổi trong phiên bản 3.6: ZipFile.open() hiện có thể được sử dụng để ghi tệp vào kho lưu trữ với tùy chọn mode='w'.

Thay đổi trong phiên bản 3.6: Gọi open() trên ZipFile đã đóng sẽ tạo ra ValueError. Trước đây, một RuntimeError đã được đưa ra.

Thay đổi trong phiên bản 3.13: Đã thêm thuộc tính namemode cho đối tượng giống như tệp có thể ghi. Giá trị của thuộc tính mode cho đối tượng giống như tệp có thể đọc được đã được thay đổi từ 'r' thành 'rb'.

ZipFile.extract(member, path=None, pwd=None)

Trích xuất một thành viên từ kho lưu trữ vào thư mục làm việc hiện tại; member phải là tên đầy đủ của nó hoặc đối tượng ZipInfo. Thông tin tập tin của nó được trích xuất chính xác nhất có thể. path chỉ định một thư mục khác để giải nén. member có thể là tên tệp hoặc đối tượng ZipInfo. pwd là mật khẩu được sử dụng cho các tệp được mã hóa dưới dạng đối tượng bytes.

Trả về đường dẫn chuẩn hóa đã tạo (thư mục hoặc tệp mới).

Ghi chú

Nếu tên tệp thành viên là đường dẫn tuyệt đối, điểm chia sẻ drive/UNC và dấu gạch chéo ở đầu (trở lại) sẽ bị xóa, ví dụ: ///foo/bar trở thành foo/bar trên Unix và C:\foo\bar trở thành foo\bar trên Windows. Và tất cả các thành phần ".." trong tên tệp thành viên sẽ bị xóa, ví dụ: ../../foo../../ba..r trở thành foo../ba..r. Trên Windows các ký tự không hợp lệ (:, <, >, |, ", ?*) được thay thế bằng dấu gạch dưới (_).

Thay đổi trong phiên bản 3.6: Gọi extract() trên ZipFile đã đóng sẽ tạo ra ValueError. Trước đây, một RuntimeError đã được đưa ra.

Thay đổi trong phiên bản 3.6.2: Tham số path chấp nhận path-like object.

ZipFile.extractall(path=None, members=None, pwd=None)

Trích xuất tất cả các thành viên từ kho lưu trữ vào thư mục làm việc hiện tại. path chỉ định một thư mục khác để giải nén. members là tùy chọn và phải là tập hợp con của danh sách được trả về bởi namelist(). pwd là mật khẩu được sử dụng cho các tệp được mã hóa dưới dạng đối tượng bytes.

Cảnh báo

Không bao giờ trích xuất tài liệu lưu trữ từ các nguồn không đáng tin cậy mà không kiểm tra trước. Có thể các tệp được tạo bên ngoài path, ví dụ: thành viên có tên tệp tuyệt đối bắt đầu bằng "/" hoặc tên tệp có hai dấu chấm "..". Mô-đun này cố gắng ngăn chặn điều đó. Xem ghi chú extract().

Thay đổi trong phiên bản 3.6: Gọi extractall() trên ZipFile đã đóng sẽ tạo ra ValueError. Trước đây, một RuntimeError đã được đưa ra.

Thay đổi trong phiên bản 3.6.2: Tham số path chấp nhận path-like object.

ZipFile.printdir()

In mục lục để lưu trữ vào sys.stdout.

ZipFile.setpassword(pwd)

Đặt pwd (đối tượng bytes) làm mật khẩu mặc định để giải nén các tệp được mã hóa.

ZipFile.read(name, pwd=None)

Trả về byte của tệp name trong kho lưu trữ. name là tên của tệp trong kho lưu trữ hoặc đối tượng ZipInfo. Kho lưu trữ phải được mở để đọc hoặc nối thêm. pwd là mật khẩu được sử dụng cho các tệp được mã hóa dưới dạng đối tượng bytes và nếu được chỉ định, sẽ ghi đè mật khẩu mặc định được đặt bằng setpassword(). Gọi read() trên ZipFile sử dụng phương pháp nén khác với ZIP_STORED, ZIP_DEFLATED, ZIP_BZIP2, ZIP_LZMA hoặc ZIP_ZSTANDARD sẽ tạo ra NotImplementedError. Lỗi cũng sẽ xuất hiện nếu mô-đun nén tương ứng không có sẵn.

Thay đổi trong phiên bản 3.6: Gọi read() trên ZipFile đã đóng sẽ tạo ra ValueError. Trước đây, một RuntimeError đã được đưa ra.

ZipFile.testzip()

Đọc tất cả các tệp trong kho lưu trữ và kiểm tra tiêu đề tệp và CRC của chúng. Trả về tên của tệp xấu đầu tiên, nếu không trả về None.

Thay đổi trong phiên bản 3.6: Gọi testzip() trên ZipFile đã đóng sẽ tạo ra ValueError. Trước đây, một RuntimeError đã được đưa ra.

ZipFile.write(filename, arcname=None, compress_type=None, compresslevel=None)

Ghi tệp có tên filename vào kho lưu trữ, đặt tên lưu trữ là arcname (theo mặc định, tên này sẽ giống với filename, nhưng không có ký tự ổ đĩa và đã loại bỏ các dấu phân cách đường dẫn ở đầu). Nếu được cung cấp, compress_type sẽ ghi đè giá trị đã cho cho tham số compression vào hàm tạo cho mục nhập mới. Tương tự, compresslevel sẽ ghi đè hàm tạo nếu được đưa ra. Kho lưu trữ phải được mở ở chế độ 'w', 'x' hoặc 'a'.

Ghi chú

Tiêu chuẩn tệp ZIP trước đây không chỉ định mã hóa siêu dữ liệu nhưng đặc biệt khuyến nghị CP437 (mã hóa IBM PC gốc) để có khả năng tương tác. Các phiên bản gần đây cho phép sử dụng UTF-8 (chỉ). Trong mô-đun này, UTF-8 sẽ tự động được sử dụng để viết tên thành viên nếu chúng chứa bất kỳ ký tự nào không phải ASCII. Không thể viết tên thành viên bằng bất kỳ mã hóa nào ngoài ASCII hoặc UTF-8.

Ghi chú

Tên kho lưu trữ phải liên quan đến thư mục gốc của kho lưu trữ, nghĩa là chúng không được bắt đầu bằng dấu phân cách đường dẫn.

Ghi chú

Nếu arcname (hoặc filename, nếu không cung cấp arcname) chứa một byte rỗng, tên của tệp trong kho lưu trữ sẽ bị cắt bớt ở byte rỗng.

Ghi chú

Dấu gạch chéo ở đầu tên tệp có thể dẫn đến không thể mở được kho lưu trữ trong một số chương trình zip trên hệ thống Windows.

Thay đổi trong phiên bản 3.6: Gọi write() trên ZipFile được tạo bằng chế độ 'r' hoặc ZipFile đã đóng sẽ tạo ra ValueError. Trước đây, một RuntimeError đã được đưa ra.

ZipFile.writestr(zinfo_or_arcname, data, compress_type=None, compresslevel=None)

Viết một tập tin vào kho lưu trữ. Nội dung là data, có thể là phiên bản str hoặc bytes; nếu là str, trước tiên nó được mã hóa thành UTF-8. zinfo_or_arcname là tên tệp sẽ được cung cấp trong kho lưu trữ hoặc phiên bản ZipInfo. Nếu đó là một phiên bản thì ít nhất phải cung cấp tên tệp, ngày và giờ. Nếu là tên thì ngày và giờ được đặt thành ngày và giờ hiện tại. Kho lưu trữ phải được mở ở chế độ 'w', 'x' hoặc 'a'.

Nếu được cung cấp, compress_type sẽ ghi đè giá trị đã cung cấp cho tham số compression cho hàm tạo cho mục nhập mới hoặc trong zinfo_or_arcname (nếu đó là phiên bản ZipInfo). Tương tự, compresslevel sẽ ghi đè hàm tạo nếu được đưa ra.

Ghi chú

Khi truyền một phiên bản ZipInfo làm tham số zinfo_or_arcname, phương thức nén được sử dụng sẽ được chỉ định trong thành viên compress_type của phiên bản ZipInfo đã cho. Theo mặc định, hàm tạo ZipInfo đặt thành viên này thành ZIP_STORED.

Thay đổi trong phiên bản 3.2: Đối số compress_type.

Thay đổi trong phiên bản 3.6: Gọi writestr() trên ZipFile được tạo bằng chế độ 'r' hoặc ZipFile đã đóng sẽ tạo ra ValueError. Trước đây, một RuntimeError đã được đưa ra.

Thay đổi trong phiên bản 3.14: Bây giờ tôn trọng biến môi trường SOURCE_DATE_EPOCH. Nếu được đặt, nó sẽ sử dụng giá trị này làm dấu thời gian sửa đổi cho tệp được ghi vào kho lưu trữ ZIP, thay vì sử dụng thời gian hiện tại.

ZipFile.mkdir(zinfo_or_directory, mode=511)

Tạo một thư mục bên trong kho lưu trữ. Nếu zinfo_or_directory là một chuỗi, một thư mục sẽ được tạo bên trong kho lưu trữ với chế độ được chỉ định trong đối số mode. Tuy nhiên, nếu zinfo_or_directory là một phiên bản ZipInfo thì đối số mode sẽ bị bỏ qua.

Kho lưu trữ phải được mở ở chế độ 'w', 'x' hoặc 'a'.

Added in version 3.11.

Các thuộc tính dữ liệu sau đây cũng có sẵn:

ZipFile.filename

Tên của tập tin ZIP.

ZipFile.debug

Mức đầu ra gỡ lỗi sẽ sử dụng. Điều này có thể được đặt từ 0 (mặc định, không có đầu ra) thành 3 (đầu ra nhiều nhất). Thông tin gỡ lỗi được ghi vào sys.stdout.

ZipFile.comment

Nhận xét được liên kết với tệp ZIP dưới dạng đối tượng bytes. Nếu chỉ định nhận xét cho phiên bản ZipFile được tạo bằng chế độ 'w', 'x' hoặc 'a', thì nhận xét đó không được dài hơn 65535 byte. Những bình luận dài hơn sẽ bị cắt bớt.

Đối tượng đường dẫn

class zipfile.Path(root, at='')

Xây dựng một đối tượng Đường dẫn từ tệp zip root (có thể là phiên bản ZipFile hoặc file phù hợp để truyền tới hàm tạo ZipFile).

at chỉ định vị trí của Đường dẫn này trong tệp zip, ví dụ: 'dir/file.txt', 'dir/' hoặc ''. Mặc định là chuỗi trống, biểu thị gốc.

Ghi chú

Lớp Path không lọc tên tệp trong kho lưu trữ ZIP. Không giống như các phương thức ZipFile.extract()ZipFile.extractall(), người gọi có trách nhiệm xác thực hoặc loại bỏ tên tệp để ngăn chặn các lỗ hổng truyền tải đường dẫn (ví dụ: tên tệp chứa ".." hoặc đường dẫn tuyệt đối). Khi xử lý các kho lưu trữ không đáng tin cậy, hãy cân nhắc việc giải quyết tên tệp bằng os.path.abspath() và kiểm tra thư mục đích bằng os.path.commonpath().

Các đối tượng đường dẫn hiển thị các tính năng sau của đối tượng pathlib.Path:

Các đối tượng đường dẫn có thể duyệt qua bằng toán tử / hoặc joinpath.

Path.name

Thành phần đường dẫn cuối cùng.

Path.open(mode='r', *, pwd, **)

Gọi ZipFile.open() trên đường dẫn hiện tại. Cho phép mở để đọc hoặc ghi, văn bản hoặc nhị phân thông qua các chế độ được hỗ trợ: 'r', 'w', 'rb', 'wb'. Đối số vị trí và từ khóa được chuyển tới io.TextIOWrapper khi được mở dưới dạng văn bản và bị bỏ qua nếu không. pwd là tham số pwd cho ZipFile.open().

Thay đổi trong phiên bản 3.9: Đã thêm hỗ trợ cho chế độ văn bản và nhị phân để mở. Chế độ mặc định bây giờ là văn bản.

Thay đổi trong phiên bản 3.11.2: Tham số encoding có thể được cung cấp dưới dạng đối số vị trí mà không gây ra TypeError. Như có thể trong 3.9. Mã cần tương thích với các phiên bản 3.10 và 3.11 chưa được vá phải vượt qua tất cả các đối số io.TextIOWrapper, bao gồm encoding, làm từ khóa.

Path.iterdir()

Liệt kê các thư mục con của thư mục hiện tại.

Path.is_dir()

Trả về True nếu ngữ cảnh hiện tại tham chiếu đến một thư mục.

Path.is_file()

Trả về True nếu ngữ cảnh hiện tại tham chiếu đến một tệp.

Trả về True nếu ngữ cảnh hiện tại tham chiếu đến một liên kết tượng trưng.

Added in version 3.12.

Thay đổi trong phiên bản 3.13: Trước đây, is_symlink sẽ trả về False một cách vô điều kiện.

Path.exists()

Trả về True nếu ngữ cảnh hiện tại tham chiếu đến một tệp hoặc thư mục trong tệp zip.

Path.suffix

Phần được phân tách bằng dấu chấm cuối cùng của thành phần cuối cùng, nếu có. Đây thường được gọi là phần mở rộng tập tin.

Added in version 3.11: Đã thêm thuộc tính Path.suffix.

Path.stem

Thành phần đường dẫn cuối cùng, không có hậu tố của nó.

Added in version 3.11: Đã thêm thuộc tính Path.stem.

Path.suffixes

Danh sách các hậu tố của đường dẫn, thường được gọi là phần mở rộng tệp.

Added in version 3.11: Đã thêm thuộc tính Path.suffixes.

Path.read_text(*, **)

Đọc tệp hiện tại dưới dạng văn bản unicode. Đối số vị trí và từ khóa được chuyển qua io.TextIOWrapper (ngoại trừ buffer, được ngụ ý theo ngữ cảnh).

Thay đổi trong phiên bản 3.11.2: Tham số encoding có thể được cung cấp dưới dạng đối số vị trí mà không gây ra TypeError. Như có thể trong 3.9. Mã cần tương thích với các phiên bản 3.10 và 3.11 chưa được vá phải vượt qua tất cả các đối số io.TextIOWrapper, bao gồm encoding, làm từ khóa.

Path.read_bytes()

Đọc tệp hiện tại dưới dạng byte.

Path.joinpath(*other)

Trả về một đối tượng Path mới với mỗi đối số other được nối. Sau đây là tương đương:

>>> Đường dẫn(...).joinpath('child').joinpath('cháu')
>>> Path(...).joinpath('con', 'cháu')
>>> Đường dẫn(...) / 'con' / 'cháu'

Thay đổi trong phiên bản 3.10: Trước 3.10, joinpath không có giấy tờ và chấp nhận chính xác một tham số.

Dự án zipp cung cấp các bản sao lưu của chức năng đối tượng đường dẫn mới nhất cho các Python cũ hơn. Sử dụng zipp.Path thay cho zipfile.Path để có quyền truy cập sớm vào các thay đổi.

Đối tượng PyZipFile

Hàm tạo PyZipFile có cùng tham số với hàm tạo ZipFile và một tham số bổ sung, optimize.

class zipfile.PyZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, optimize=-1)

Thay đổi trong phiên bản 3.2: Đã thêm tham số optimize.

Thay đổi trong phiên bản 3.4: Tiện ích mở rộng ZIP64 được bật theo mặc định.

Các phiên bản có một phương thức ngoài các phương thức của đối tượng ZipFile:

writepy(pathname, basename='', filterfunc=None)

Tìm kiếm tệp *.py và thêm tệp tương ứng vào kho lưu trữ.

Nếu tham số optimize cho PyZipFile không được cung cấp hoặc -1, tệp tương ứng là tệp *.pyc, biên dịch nếu cần.

Nếu tham số optimize cho PyZipFile0, 1 hoặc 2, chỉ các tệp có mức tối ưu hóa đó (xem compile()) mới được thêm vào kho lưu trữ, biên dịch nếu cần.

Nếu pathname là một tệp, tên tệp phải kết thúc bằng .py và chỉ tệp (*.pyc tương ứng) được thêm vào ở cấp cao nhất (không có thông tin đường dẫn). Nếu pathname là một tệp không kết thúc bằng .py thì RuntimeError sẽ được nâng lên. Nếu đó là một thư mục và thư mục đó không phải là thư mục gói thì tất cả các tệp *.pyc sẽ được thêm vào ở cấp cao nhất. Nếu thư mục là thư mục gói thì tất cả *.pyc sẽ được thêm vào dưới tên gói dưới dạng đường dẫn tệp và nếu bất kỳ thư mục con nào là thư mục gói thì tất cả các thư mục này sẽ được thêm đệ quy theo thứ tự được sắp xếp.

basename chỉ dành cho mục đích sử dụng nội bộ.

filterfunc, nếu được cung cấp, phải là một hàm lấy một đối số chuỗi đơn. Nó sẽ được chuyển qua từng đường dẫn (bao gồm từng đường dẫn tệp đầy đủ riêng lẻ) trước khi được thêm vào kho lưu trữ. Nếu filterfunc trả về giá trị sai, đường dẫn sẽ không được thêm và nếu đó là một thư mục thì nội dung của nó sẽ bị bỏ qua. Ví dụ: nếu tất cả các tệp thử nghiệm của chúng tôi đều nằm trong thư mục test hoặc bắt đầu bằng chuỗi test_, thì chúng tôi có thể sử dụng filterfunc để loại trừ chúng:

>>> zf = PyZipFile('myprog.zip')
>>> ghi chú def:
... fn = os.path.basename(s)
... return (không phải (fn == 'test' hoặc fn.startswith('test_')))
...
>>> zf.writepy('myprog', filterfunc=notes)

Phương thức writepy() tạo các bản lưu trữ có tên tệp như thế này

Tên cấp độ string.pyc # Top
thư mục test/__init__.pyc # Package
test/testall.pyc # Module test.testall
thư mục test/bogus/__init__.pyc # Subpackage
kiểm tra/không  thật/myfile.pyc # Submodule test.bogus.myfile

Thay đổi trong phiên bản 3.4: Đã thêm tham số filterfunc.

Thay đổi trong phiên bản 3.6.2: Tham số pathname chấp nhận path-like object.

Thay đổi trong phiên bản 3.7: Đệ quy sắp xếp các mục thư mục.

Đối tượng ZipInfo

Các thể hiện của lớp ZipInfo được trả về bằng các phương thức getinfo()infolist() của các đối tượng ZipFile. Mỗi đối tượng lưu trữ thông tin về một thành viên của kho lưu trữ ZIP.

Có một phương thức phân loại để tạo một phiên bản ZipInfo cho tệp hệ thống tệp:

classmethod ZipInfo.from_file(filename, arcname=None, *, strict_timestamps=True)

Tạo một phiên bản ZipInfo cho một tệp trên hệ thống tệp, để chuẩn bị thêm nó vào tệp zip.

filename phải là đường dẫn đến tệp hoặc thư mục trên hệ thống tệp.

Nếu arcname được chỉ định, nó sẽ được sử dụng làm tên trong kho lưu trữ. Nếu arcname không được chỉ định, tên sẽ giống như filename, nhưng loại bỏ mọi ký tự ổ đĩa và dấu phân cách đường dẫn đầu.

Đối số strict_timestamps, khi được đặt thành False, cho phép nén các tệp cũ hơn 1980-01-01 với chi phí đặt dấu thời gian thành 1980-01-01. Hành vi tương tự xảy ra với các tệp mới hơn 2107-12-31, dấu thời gian cũng được đặt ở mức giới hạn.

Added in version 3.6.

Thay đổi trong phiên bản 3.6.2: Tham số filename chấp nhận path-like object.

Thay đổi trong phiên bản 3.8: Đã thêm tham số chỉ từ khóa strict_timestamps.

Các cá thể có các phương thức và thuộc tính sau:

ZipInfo.is_dir()

Trả về True nếu thành viên lưu trữ này là một thư mục.

Điều này sử dụng tên của mục: các thư mục phải luôn kết thúc bằng /.

Added in version 3.6.

ZipInfo.filename

Tên của tập tin trong kho lưu trữ.

ZipInfo.date_time

Ngày và giờ của lần sửa đổi cuối cùng đối với thành viên lưu trữ. Đây là một bộ gồm sáu giá trị biểu thị các trường "thời gian tệp [đã sửa đổi] gần đây nhất" và "ngày tệp [đã sửa đổi] lần cuối" từ thư mục trung tâm của tệp ZIP.

Bộ dữ liệu chứa:

chỉ mục

Giá trị

0

Năm (>= 1980)

1

Tháng (dựa trên một)

2

Ngày trong tháng (dựa trên một)

3

Số giờ (dựa trên số 0)

4

Phút (dựa trên số 0)

5

Giây (dựa trên số 0)

Ghi chú

Định dạng ZIP hỗ trợ nhiều trường dấu thời gian ở các vị trí khác nhau (thư mục trung tâm, các trường bổ sung cho hệ thống NTFS/UNIX, v.v.). Thuộc tính này đặc biệt trả về dấu thời gian từ thư mục trung tâm. Định dạng dấu thời gian của thư mục trung tâm trong tệp ZIP không hỗ trợ dấu thời gian trước năm 1980. Trong khi một số định dạng trường bổ sung (chẳng hạn như dấu thời gian UNIX) có thể biểu thị các ngày sớm hơn, thuộc tính này chỉ trả về dấu thời gian của thư mục trung tâm.

Dấu thời gian của thư mục trung tâm được hiểu là biểu thị giờ địa phương, thay vì thời gian UTC, để phù hợp với hoạt động của các công cụ zip khác.

ZipInfo.compress_type

Kiểu nén cho thành viên lưu trữ.

ZipInfo.comment

Nhận xét cho thành viên lưu trữ riêng lẻ dưới dạng đối tượng bytes.

ZipInfo.extra

Dữ liệu trường mở rộng. Zz001zz chứa một số nhận xét về cấu trúc bên trong của dữ liệu chứa trong đối tượng bytes này.

ZipInfo.create_system

Hệ thống đã tạo kho lưu trữ ZIP.

ZipInfo.create_version

Phiên bản PKZIP đã tạo kho lưu trữ ZIP.

ZipInfo.extract_version

Phiên bản PKZIP cần thiết để giải nén kho lưu trữ.

ZipInfo.reserved

Phải bằng không.

ZipInfo.flag_bits

bit cờ ZIP.

ZipInfo.volume

Số tập của tiêu đề tập tin.

ZipInfo.internal_attr

Thuộc tính bên trong.

ZipInfo.external_attr

Thuộc tính tệp bên ngoài.

ZipInfo.header_offset

Bù byte cho tiêu đề tệp.

ZipInfo.CRC

CRC-32 của tệp không nén.

ZipInfo.compress_size

Kích thước của dữ liệu nén.

ZipInfo.file_size

Kích thước của tập tin không nén.

Giao diện dòng lệnh

Mô-đun zipfile cung cấp giao diện dòng lệnh đơn giản để tương tác với kho lưu trữ ZIP.

Nếu bạn muốn tạo một kho lưu trữ ZIP mới, hãy chỉ định tên của nó sau tùy chọn -c và sau đó liệt kê (các) tên tệp sẽ được đưa vào:

$ python -m zipfile -c monty.zip spam.txt trứng.txt

Việc chuyển một thư mục cũng được chấp nhận:

$ python -m zipfile -c monty.zip life-of-brian_1979/

Nếu bạn muốn trích xuất kho lưu trữ ZIP vào thư mục được chỉ định, hãy sử dụng tùy chọn -e:

$ python -m zipfile -e monty.zip target-dir/

Để biết danh sách các tệp trong kho lưu trữ ZIP, hãy sử dụng tùy chọn -l:

$ python -m zipfile -l monty.zip

Tùy chọn dòng lệnh

-l <zipfile>
--list <zipfile>

Liệt kê các tập tin trong một zipfile.

-c <zipfile> <source1> ... <sourceN>
--create <zipfile> <source1> ... <sourceN>

Tạo zipfile từ các tập tin nguồn.

-e <zipfile> <output_dir>
--extract <zipfile> <output_dir>

Giải nén zipfile vào thư mục đích.

-t <zipfile>
--test <zipfile>

Kiểm tra xem zipfile có hợp lệ hay không.

--metadata-encoding <encoding>

Chỉ định mã hóa tên thành viên cho -l, -e-t.

Added in version 3.11.

Cạm bẫy giải nén

Việc trích xuất trong mô-đun zipfile có thể không thành công do một số cạm bẫy được liệt kê bên dưới.

Từ chính tập tin

Quá trình giải nén có thể không thành công do sai mật khẩu/tổng kiểm tra CRC/định dạng ZIP hoặc phương pháp nén/giải mã không được hỗ trợ.

Giới hạn hệ thống tập tin

Việc vượt quá giới hạn trên các hệ thống tệp khác nhau có thể khiến quá trình giải nén không thành công. Chẳng hạn như các ký tự được phép trong mục nhập thư mục, độ dài của tên tệp, độ dài của tên đường dẫn, kích thước của một tệp và số lượng tệp, v.v.

Hạn chế về tài nguyên

Việc thiếu bộ nhớ hoặc dung lượng đĩa sẽ dẫn đến việc giải nén không thành công. Ví dụ: bom giải nén (còn gọi là ZIP bomb) áp dụng cho thư viện zipfile có thể gây cạn kiệt dung lượng ổ đĩa.

Gián đoạn

Sự gián đoạn trong quá trình giải nén, chẳng hạn như nhấn control-C hoặc tắt quá trình giải nén có thể dẫn đến việc giải nén kho lưu trữ không hoàn toàn.

Hành vi trích xuất mặc định

Việc không biết các hành vi giải nén mặc định có thể gây ra kết quả giải nén không mong muốn. Ví dụ: khi giải nén cùng một kho lưu trữ hai lần, nó sẽ ghi đè lên các tệp mà không cần hỏi.