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, lzma và compression.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.Pathcung cấp, bao gồm giao diệnimportlib.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()vàinfolist()của các đối tượngZipFile. Hầu hết người dùng mô-đunzipfilesẽ 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_levelcô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ề
Truenế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_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ức93để tránh xung đột, trong đó ID phương thức20không được dùng nữa. Để tương thích, mô-đunzipfileđọc cả hai ID phương thức nhưng sẽ chỉ ghi dữ liệu với ID phương thức93.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 là'x'và file đề cập đến một tệp hiện có thìFileExistsErrorsẽ được nâng lên. Nếu mode là'a'và 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 là'a'và tệp hoàn toàn không tồn tại thì nó sẽ được tạo. Nếu mode là'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_LZMAhoặcZIP_ZSTANDARD; các giá trị không được nhận dạng sẽ khiếnNotImplementedErrortăng lên. NếuZIP_DEFLATED,ZIP_BZIP2,ZIP_LZMAhoặcZIP_ZSTANDARDđược chỉ định nhưng mô-đun tương ứng (zlib,bz2,lzmahoặccompression.zstd) không khả dụng,RuntimeErrorsẽ được nâng lên. Mặc định làZIP_STORED.Nếu allowZip64 là
True(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àfalsezipfilesẽ đư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_STOREDhoặcZIP_LZMAthì không có tác dụng. Khi sử dụng số nguyênZIP_DEFLATED, số nguyên0đến9được chấp nhận (xemzlibđể biết thêm thông tin). Khi sử dụng số nguyênZIP_BZIP2, số nguyên1đến9được chấp nhận (xembz2để biết thêm thông tin). Khi sử dụng số nguyênZIP_ZSTANDARD, các số nguyên-131072đến22thường được chấp nhận (xemCompressionParameter.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àclosedmà 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ệnhwithkết thúc---ngay cả khi xảy ra ngoại lệ:với ZipFile('spam.zip', 'w') là 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
ZipFilelàm trình quản lý bối cảnh.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
ZipInfovới thông tin về thành viên lưu trữ name. Gọigetinfo()cho một tên hiện không có trong kho lưu trữ sẽ tạo raKeyError.
- ZipFile.infolist()¶
Trả về danh sách chứa đối tượng
ZipInfocho 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ượngbytes.open()cũng là một trình quản lý bối cảnh và do đó hỗ trợ câu lệnhwithvới ZipFile('spam.zip') là myzip: với myzip.open('eggs.txt') là 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ứcwrite(). 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ỗiValueError.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ượngZipInfovới tập hợpfile_sizevà sử dụng đối tượng đó làm tham số name.Ghi chú
Các phương thức
open(),read()vàextract()có thể lấy tên tệp hoặc đối tượngZipInfo. 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ụngio.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ọnmode='w'.Thay đổi trong phiên bản 3.6: Gọi
open()trên ZipFile đã đóng sẽ tạo raValueError. Trước đây, mộtRuntimeErrorđã được đưa ra.Thay đổi trong phiên bản 3.13: Đã thêm thuộc tính
namevàmodecho đối tượng giống như tệp có thể ghi. Giá trị của thuộc tínhmodecho đố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ượngZipInfo. 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ượngbytes.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/bartrở thànhfoo/bartrên Unix vàC:\foo\bartrở thànhfoo\bartrê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..rtrở thànhfoo../ba..r. Trên Windows các ký tự không hợp lệ (:,<,>,|,",?và*) đượ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 raValueError. Trước đây, mộtRuntimeErrorđã đượ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ượngbytes.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 raValueError. Trước đây, mộtRuntimeErrorđã đượ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ượngbytesvà nếu được chỉ định, sẽ ghi đè mật khẩu mặc định được đặt bằngsetpassword(). Gọiread()trên ZipFile sử dụng phương pháp nén khác vớiZIP_STORED,ZIP_DEFLATED,ZIP_BZIP2,ZIP_LZMAhoặcZIP_ZSTANDARDsẽ tạo raNotImplementedError. 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 raValueError. Trước đây, mộtRuntimeErrorđã đượ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 raValueError. Trước đây, mộtRuntimeErrorđã đượ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ặcfilename, nếu không cung cấparcname) 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 raValueError. Trước đây, mộtRuntimeErrorđã đượ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
strhoặcbytes; 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ảnZipInfo. 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
ZipInfolà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ảnZipInfođã cho. Theo mặc định, hàm tạoZipInfođặt thành viên này thànhZIP_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 raValueError. Trước đây, mộtRuntimeErrorđã đượ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
ZipInfothì đố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ành3(đầu ra nhiều nhất). Thông tin gỡ lỗi được ghi vàosys.stdout.
Đố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ảnZipFilehoặcfilephù hợp để truyền tới hàm tạoZipFile).atchỉ đị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
Pathkhông lọc tên tệp trong kho lưu trữ ZIP. Không giống như các phương thứcZipFile.extract()và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ằngos.path.abspath()và kiểm tra thư mục đích bằngos.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ớiio.TextIOWrapperkhi được mở dưới dạng văn bản và bị bỏ qua nếu không.pwdlà tham sốpwdchoZipFile.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ố
encodingcó thể được cung cấp dưới dạng đối số vị trí mà không gây raTypeError. 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ồmencoding, 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ề
Truenếu ngữ cảnh hiện tại tham chiếu đến một thư mục.
- Path.is_file()¶
Trả về
Truenếu ngữ cảnh hiện tại tham chiếu đến một tệp.
- Path.is_symlink()¶
Trả về
Truenế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_symlinksẽ trả vềFalsemột cách vô điều kiện.
- Path.exists()¶
Trả về
Truenế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ố
encodingcó thể được cung cấp dưới dạng đối số vị trí mà không gây raTypeError. 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ồmencoding, 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,
joinpathkhô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
*.pyvà thêm tệp tương ứng vào kho lưu trữ.Nếu tham số optimize cho
PyZipFilekhô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
PyZipFilelà0,1hoặc2, chỉ các tệp có mức tối ưu hóa đó (xemcompile()) 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
.pyvà chỉ tệp (*.pyctươ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.pythìRuntimeErrorsẽ đượ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*.pycsẽ đượ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ả*.pycsẽ đượ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
testhoặc bắt đầu bằng chuỗitest_, 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àyTê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 có 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() và 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
ZipInfocho 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ề
Truenế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ị
0Năm (>= 1980)
1Tháng (dựa trên một)
2Ngày trong tháng (dựa trên một)
3Số giờ (dựa trên số 0)
4Phút (dựa trên số 0)
5Giâ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.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
bytesnà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¶
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.