Python tạo tệp zip không có cấu trúc thư mục
Có nhiều cách để nén tệp trong thư mục. Mục đích của bài viết này là mô tả một số tùy chọn nhanh để nén một thư mục cụ thể. Nó sẽ mô tả cách thực hiện việc này bằng phương pháp Kéo và Thả và menu ngữ cảnh WinZip. Vui lòng xem các liên kết Bài viết liên quan ở cuối bài viết này để biết thêm thông tin Show
Để nén một thư mục bằng Kéo và Thả, bạn có thể
Nếu bạn không muốn sử dụng phương pháp Kéo và Thả, bạn có thể sử dụng menu ngữ cảnh WinZip (nhấp chuột phải). Để thực hiện việc này, nhấp chuột phải vào thư mục bạn muốn Zip và chọn một trong các tùy chọn Thêm vào tệp Zip Ví dụ: giả sử cấu trúc thư mục của c. \level1\level2\level3 tồn tại và bạn muốn duy trì cấu trúc thư mục level2\level3 cùng với các tệp. Bạn có thể làm như sau
Tệp Zip kết quả sẽ duy trì cấu trúc tệp/thư mục cấp 2 và sẽ bao gồm các thư mục con bên dưới Trong Python, bạn có thể nén và giải nén tệp, tôi. e. , nén tệp thành tệp ZIP và giải nén tệp ZIP bằng mô-đun zipfile
Ngoài ra, bạn có thể dễ dàng nén một thư mục (thư mục) và giải nén tệp ZIP bằng 2 và 3 của mô-đun Shutil
Cả hai đều có trong thư viện chuẩn nên không cần cài đặt thêm Bài viết này mô tả các nội dung sau
Liên kết được tài trợ Zip một thư mục (thư mục). shutil.make_archive('archive_shutil_base', format='zip', root_dir='.', base_dir='dir_zip') 4Bạn có thể nén một thư mục (folder), tôi. e. , tạo tệp ZIP từ thư mục có 4
Tham số đầu tiên 9 là đường dẫn không có phần mở rộng của tệp ZIP cần tạo, tham số thứ hai 0 là định dạng lưu trữ ( 1, 2, 3, 4, 5), và tham số thứ ba 6 là đường dẫn của thư mục cần nénVí dụ: giả sử có một thư mục 7 với cấu trúc sau trong thư mục hiện tại 6Nén thư mục này thành tệp ZIP 8 trong thư mục hiện tại 8nguồn. zip_archive. py Trong trường hợp này, bản thân thư mục được chỉ định 7 không được bao gồm trong 8Nếu bạn muốn bao gồm chính thư mục đó, hãy chỉ định đường dẫn của thư mục trên của thư mục đích trong tham số thứ ba 6 và đường dẫn tương đối của thư mục đích từ 6 trong tham số thứ tư 33
nguồn. zip_archive. py Xem phần tiếp theo để biết kết quả giải nén Giải nén một tập tin. shutil.make_archive('archive_shutil_base', format='zip', root_dir='.', base_dir='dir_zip') 5Bạn có thể giải nén một tập tin, tôi. e. , trích xuất tất cả nội dung của tệp ZIP bằng 5
Tham số đầu tiên 36 là đường dẫn của tệp ZIP và tham số thứ hai 37 là đường dẫn của thư mục đích nơi lưu trữ được trích xuất________số 8 nguồn. zip_archive. py Nó được trích xuất như sau 3Mặc dù tài liệu không chỉ định nó, nhưng nó dường như tạo một thư mục mới ngay cả khi không tồn tại 37 (đã xác nhận trong Python 3. 9. 9)Tệp ZIP được tạo bởi 4 với 33 được trích xuất như sau 4nguồn. zip_archive. py 5Khái niệm cơ bản về mô-đun zipfile. shutil.make_archive('archive_shutil_base', format='zip', root_dir='.', base_dir='dir_zip') 6 đối tượngMô-đun zipfile cung cấp lớp 6 để tạo, đọc, viết, nối thêm và liệt kê tệp ZIP
Các đối tượng 6 được tạo bằng cách chỉ định tham số đầu tiên 44 (đường dẫn của tệp ZIP) và tham số thứ hai 45 (đọc 46, ghi 47, nối thêm 48, v.v. ) cho hàm tạo 49Đối tượng 6 cần được đóng bằng phương thức 51, nhưng nếu bạn sử dụng câu lệnh 52, nó sẽ tự động được đóng khi khối kết thúcCách sử dụng cũng tương tự như đọc ghi file có sẵn hàm 53 như chỉ định chế độ và sử dụng câu lệnh 52
Các ví dụ cụ thể được mô tả trong các phần sau Nén các tệp riêng lẻ thành một tệp ZIPĐể nén các tệp riêng lẻ thành tệp ZIP, hãy tạo một đối tượng 6 mới và thêm các tệp bạn muốn nén bằng phương pháp 56Với 49, chỉ định đường dẫn của tệp ZIP mới được tạo làm tham số đầu tiên 44 và đặt tham số thứ hai 45 thành 47 (ghi)Ở chế độ ghi, bạn cũng có thể chỉ định phương pháp nén và mức độ với các tham số 61 và 62Phương pháp nén 61 như sau;
Đối với 68, mức nén 62 tương ứng với 50 của 51. Mặc định là 52 ( 53)
Phương thức 56 của đối tượng 6 ghi tệp có tên tham số đầu tiên là 36 vào một tệp ZIP, cung cấp cho nó tên lưu trữ (= tên trong ZIP) tham số thứ hai là 57. Nếu bỏ qua 57, 36 được sử dụng làm tên lưu trữ. Bạn có thể chỉ định cấu trúc thư mục cho 57
6nguồn. zip_archive. py Bạn cũng có thể chọn phương thức nén và cấp độ cho từng tệp bằng cách chỉ định 71 và 62 trong phương thức 56Thêm các tệp khác vào tệp ZIP hiện cóĐể thêm các tệp khác vào tệp ZIP hiện có, với 49, hãy đặt tham số đầu tiên 44 thành đường dẫn của tệp ZIP hiện có và tham số thứ hai 45 thành 48 (nối thêm)Thêm các tệp hiện cóBạn có thể thêm các tệp hiện có bằng phương thức 56 của đối tượng 6Sau đây là một ví dụ về việc thêm 800 vào thư mục hiện tại. Đối số 57 bị bỏ qua 5nguồn. zip_archive. py Tạo và thêm một tệp mớiBạn cũng có thể tạo một tệp mới và thêm nó. Sử dụng phương thức 53 của đối tượng 6 với chế độ chắp thêm ( 48)
Chỉ định đường dẫn của tệp mới tạo trong ZIP làm tham số đầu tiên và đặt tham số thứ hai 45 thành 47Bạn có thể viết nội dung bằng phương thức 56 của đối tượng tệp đã mở 7nguồn. zip_archive. py Đối số của 56 nên được chỉ định là 809, không phải là 810. Để viết một văn bản, hãy sử dụng 811 hoặc chuyển đổi nó bằng phương pháp 812 của 810 80nguồn. zip_archive. py Một ví dụ về việc đọc một tệp trong ZIP với 53 của đối tượng 6 được mô tả sauLiên kết được tài trợ Kiểm tra danh sách các tệp trong tệp ZIPĐể kiểm tra nội dung của tệp ZIP hiện có, hãy tạo một đối tượng 6 với tham số đầu tiên là 44 là đường dẫn của tệp ZIP hiện có và tham số thứ hai là 45 là 46 (đã đọc). Có thể bỏ qua 45 vì mặc định là 46Bạn có thể lấy danh sách các mục đã lưu trữ bằng phương thức 822 của đối tượng 6
81nguồn. zip_archive. py Như bạn có thể thấy từ kết quả trên, các tệp ZIP được tạo bằng 4 cũng liệt kê các thư mục riêng lẻ. Điều này cũng đúng với các tệp ZIP được nén bằng chức năng tiêu chuẩn của Finder trên máy MacBạn có thể loại trừ các thư mục có khả năng hiểu danh sách
82nguồn. zip_archive. py Trích xuất các tệp riêng lẻ từ tệp ZIPĐể giải nén tệp ZIP, hãy tạo một đối tượng 6 ở chế độ đọc ( 46, mặc định)Nếu bạn chỉ muốn giải nén các tệp cụ thể, hãy sử dụng phương pháp 827
Tham số đầu tiên 828 là tên file cần giải nén (bao gồm cả thư mục trong file zip) và tham số thứ hai 829 là đường dẫn đến thư mục cần giải nén 83nguồn. zip_archive. py Nếu bạn muốn giải nén tất cả các tệp, hãy sử dụng phương pháp 830. Chỉ định đường dẫn của thư mục để trích xuất làm đối số đầu tiên 829
84nguồn. zip_archive. py Trong cả hai trường hợp, nếu bỏ qua 829, các tệp sẽ được trích xuất vào thư mục hiện tại. Mặc dù tài liệu không chỉ định nó, nhưng nó dường như tạo một thư mục mới ngay cả khi không tồn tại 829 (đã xác nhận trong Python 3. 9. 9)Đọc tệp trong tệp ZIPBạn có thể đọc trực tiếp các tệp trong tệp ZIP Tạo một đối tượng 6 ở chế độ đọc (mặc định) và mở tệp bên trong bằng phương thức 53Đối số đầu tiên của 53 là tên của tệp trong ZIP (có thể bao gồm thư mục). Đối số thứ hai 45 có thể được bỏ qua vì giá trị mặc định là 46 (đã đọc)Có thể đọc nội dung bằng phương pháp 839 của đối tượng tệp đã mở. Một chuỗi byte 809 được trả về, có thể được chuyển đổi thành chuỗi 810 bằng phương thức 842 85nguồn. zip_archive. py Ngoài 839, có thể sử dụng 844 và 845 cũng như đối tượng tệp được mở bằng chức năng tích hợp sẵn 53
ZIP có mật khẩu (mã hóa và giải mã)Mô-đun zipfile có thể giải mã ZIP bằng mật khẩu (ZIP được mã hóa), nhưng nó không thể mã hóa ZIP
Ngoài ra, AES không được hỗ trợ
Cả 2 và 3 đều không hỗ trợ mã hóa và giải mãdây kéoPyzipper được giới thiệu trong Stack Overflow ở trên hỗ trợ mã hóa và giải mã AES, đồng thời có thể được sử dụng theo cách tương tự như zipfile
Để tạo tệp ZIP bằng mật khẩu, hãy chỉ định 849 bằng 850 và đặt mật khẩu bằng phương thức 851. Lưu ý rằng bạn cần chỉ định mật khẩu bằng chuỗi byte 809 86nguồn. zip_archive. py Sau đây là một ví dụ về giải nén tệp ZIP bằng mật khẩu 87nguồn. zip_archive. py Tất nhiên nếu sai mật khẩu thì không thể giải mã được 88nguồn. zip_archive. py Mô-đun zipfile cũng cho phép bạn chỉ định mật khẩu, nhưng như đã đề cập ở trên, nó không hỗ trợ AES 89nguồn. zip_archive. py Thực hiện lệnh với shutil.make_archive('archive_shutil_base', format='zip', root_dir='.', base_dir='dir_zip') 853Bạn cũng có thể sử dụng 853 nếu zipfile hoặc pyzipper không hoạt động, nhưng lệnh vẫn có thể xử lý nó
Sử dụng lệnh 855 của 7-zip (yêu cầu cài đặt) làm ví dụ 0nguồn. zip_archive. py Tương đương với các lệnh sau. 856 là bản mở rộng. Lưu ý rằng 857 và 858 không yêu cầu khoảng trắng |