Mô-đun zipfile trong Python cung cấp cách nén các tệp và thư mục thành một tệp zip duy nhất. Điều này hữu ích để giảm kích thước tệp và thư mục mà bạn muốn chia sẻ hoặc chuyển
Trong hướng dẫn này, bạn sẽ khám phá cách nén tệp và thư mục bằng Python bằng cách sử dụng mô-đun zipfile. Cũng như nén tệp và thư mục thành tệp zip, mô-đun zipfile cũng có thể được sử dụng để giải nén tệp trong Python
Nhập các mô-đun
Để bắt đầu, hãy mở tập lệnh Python hoặc sổ ghi chép Jupyter và nhập mô-đun zipfile và mô-đun toàn cầu. Cả hai mô-đun này đều là một phần của thư viện chuẩn Python và không cần cài đặt riêng. Mô-đun toàn cầu được sử dụng để tìm các tệp và thư mục khớp với một mẫu, trong khi mô-đun zipfile được sử dụng để tạo và giải nén các tệp zip
Sử dụng zipfile để nén một tệp
Để nén một tệp vào kho lưu trữ tệp zip, chúng ta cần gọi lớp ZipFile và chuyển tên của tệp zip làm đối số. Sau đó, chúng tôi có thể sử dụng phương pháp write[]
để thêm tệp vào tệp zip. Phương thức write[]
lấy tên của tệp để thêm làm đối số. Ví dụ sau nén tệp có tên file1.csv
và lưu nó với tên file1.zip
with zipfile.ZipFile['file1.zip', 'w'] as f:
f.write['file1.csv']
Sử dụng zipfile để nén tất cả các tệp có hậu tố nhất định
Bằng cách sử dụng mô-đun toàn cầu, chúng tôi có thể tìm thấy tất cả các tệp có hậu tố nhất định và sau đó nén chúng thành một tệp zip duy nhất. Ví dụ sau tìm tất cả các tệp có hậu tố .csv
và sau đó nén chúng thành một tệp zip có tên là
"""
Use zipfile to compress all files with the suffix .csv into a zip called data.zip
"""
with zipfile.ZipFile['data.zip', 'w'] as f:
for file in glob.glob['*.csv']:
f.write[file]
0"""
Use zipfile to compress all files with the suffix .csv into a zip called data.zip
"""
with zipfile.ZipFile['data.zip', 'w'] as f:
for file in glob.glob['*.csv']:
f.write[file]
Sử dụng zipfile để nén một thư mục
Để nén tất cả các tệp trong một thư mục thành một tệp zip, chúng ta có thể sử dụng lại mô-đun toàn cầu. Chúng tôi sẽ chuyển tên thư mục này mà chúng tôi muốn nén thành một tệp nén và sau đó là ký tự đại diện dấu hoa thị để làm cho nó bao gồm tất cả các tệp được tìm thấy trong đó. Sau đó, chúng tôi sẽ sử dụng phương pháp write[]
để thêm từng tệp vào tệp zip
"""
Use zipfile to compress directory1 into a zip called directory1.zip
"""
with zipfile.ZipFile['directory1.zip', 'w'] as f:
for file in glob.glob['directory1/*']:
f.write[file]
Sử dụng zipfile để nén một số thư mục
Chúng tôi có thể sử dụng một cách tiếp cận tương tự để nén một số thư mục vào một tệp zip duy nhất. Ví dụ sau đây nén các thư mục
"""
Use zipfile to compress all files with the suffix .csv into a zip called data.zip
"""
with zipfile.ZipFile['data.zip', 'w'] as f:
for file in glob.glob['*.csv']:
f.write[file]
2 và """
Use zipfile to compress all files with the suffix .csv into a zip called data.zip
"""
with zipfile.ZipFile['data.zip', 'w'] as f:
for file in glob.glob['*.csv']:
f.write[file]
3 thành một tệp zip có tên là """
Use zipfile to compress all files with the suffix .csv into a zip called data.zip
"""
with zipfile.ZipFile['data.zip', 'w'] as f:
for file in glob.glob['*.csv']:
f.write[file]
4"""
Use zipfile to compress directory1 and directory2 into a zip called directory1-and-2.zip
"""
with zipfile.ZipFile['directory1-and-2.zip', 'w'] as f:
for file in glob.glob['directory1/*'] + glob.glob['directory2/*']:
f.write[file]
Sử dụng zipfile để nén tất cả các tệp trong thư mục hiện tại
Cuối cùng, chúng ta có thể sử dụng mô-đun toàn cầu để tìm tất cả các tệp trong thư mục hiện tại và sau đó nén chúng thành tệp zip. Ví dụ sau nén tất cả các tệp trong thư mục hiện tại vào một tệp zip có tên là
"""
Use zipfile to compress all files with the suffix .csv into a zip called data.zip
"""
with zipfile.ZipFile['data.zip', 'w'] as f:
for file in glob.glob['*.csv']:
f.write[file]
5Nếu bạn đã sử dụng máy tính một thời gian, có lẽ bạn đã bắt gặp các tệp có định dạng. tiện ích mở rộng zip. Chúng là những tệp đặc biệt có thể chứa nội dung nén của nhiều tệp, thư mục và thư mục con khác. Điều này làm cho chúng khá hữu ích để truyền tệp qua internet. Bạn có biết rằng bạn có thể sử dụng Python để nén hoặc giải nén tệp không?
Hướng dẫn này sẽ hướng dẫn bạn cách sử dụng mô-đun zipfile trong Python để giải nén hoặc nén từng tệp hoặc nhiều tệp cùng một lúc
Nén các tệp riêng lẻ
Điều này là dễ dàng và yêu cầu rất ít mã. Chúng tôi bắt đầu bằng cách nhập mô-đun zipfile và sau đó mở đối tượng ZipFile ở chế độ ghi bằng cách chỉ định tham số thứ hai là 'w'. Tham số đầu tiên là đường dẫn đến chính tệp đó. Đây là mã mà bạn cần
1
import zipfile
2
3
with zipfile.ZipFile['C:\\Stories\\Fantasy\\jungle.zip', 'w'] as jungle_zip:
4
jungle_zip.write['C:\\Stories\\Fantasy\\jungle.pdf', compress_type=zipfile.ZIP_DEFLATED]
Xin lưu ý rằng tôi sẽ chỉ định đường dẫn trong tất cả các đoạn mã theo định dạng kiểu Windows;
Bạn có thể chỉ định các phương pháp nén khác nhau để nén tệp. Các phương thức mới hơn
import zipfile23 và
import zipfile24 đã được thêm vào phiên bản Python 3. 3 và cũng có một số công cụ khác không hỗ trợ hai phương pháp nén này. Vì lý do này, sẽ an toàn khi chỉ sử dụng phương pháp
import zipfile25. Bạn vẫn nên thử các phương pháp này để thấy sự khác biệt về kích thước của tệp nén
Nén nhiều tệp
Điều này hơi phức tạp vì bạn cần lặp lại tất cả các tệp. Mã bên dưới sẽ nén tất cả các tệp có phần mở rộng pdf trong một thư mục nhất định
1
import os
2
import zipfile
3
4
import zipfile4
import zipfile5
import zipfile6
import zipfile7
import zipfile8
import zipfile9
20
21
22
23
24
25_______11_______6_______11_______7
Lần này, chúng tôi đã nhập mô-đun
import zipfile26 và sử dụng phương pháp
import zipfile27 của nó để duyệt qua tất cả các tệp và thư mục con bên trong thư mục gốc của chúng tôi. Tôi chỉ nén các tệp pdf trong thư mục. Bạn cũng có thể tạo các tệp lưu trữ khác nhau cho từng định dạng bằng cách sử dụng câu lệnh
import zipfile28
Nếu bạn không muốn giữ nguyên cấu trúc thư mục, bạn có thể đặt tất cả các tệp lại với nhau bằng cách sử dụng dòng sau
1
29
Phương thức
import zipfile29 chấp nhận ba tham số. Tham số đầu tiên là tên của tệp mà chúng tôi muốn nén. Tham số thứ hai là tùy chọn và cho phép bạn chỉ định tên tệp khác cho tệp nén. Nếu không có gì được chỉ định, tên ban đầu được sử dụng
Giải nén tất cả các tập tin
Bạn có thể sử dụng phương pháp
import zipfile30 để trích xuất tất cả các tệp và thư mục từ tệp zip vào thư mục làm việc hiện tại. Bạn cũng có thể chuyển tên thư mục tới
import zipfile30 để giải nén tất cả các tệp và thư mục trong một thư mục cụ thể. Nếu thư mục bạn đã chuyển không tồn tại, phương pháp này sẽ tạo một thư mục cho bạn. Đây là mã mà bạn có thể sử dụng để giải nén tập tin
________9____10_______
2
3
5
4
7
Nếu bạn muốn giải nén nhiều tệp, bạn sẽ phải cung cấp tên của các tệp bạn muốn giải nén dưới dạng danh sách
Giải nén các tệp riêng lẻ
Điều này tương tự như giải nén nhiều tệp. Một điểm khác biệt là lần này bạn cần cung cấp tên tệp trước và đường dẫn để giải nén chúng sau. Ngoài ra, bạn cần sử dụng phương pháp
import zipfile32 thay vì
import zipfile30. Đây là một đoạn mã cơ bản để trích xuất các tệp riêng lẻ
1
import zipfile
2
3
5
4
34
Nhận thông tin về tệp
Xem xét một tình huống mà bạn cần xem liệu kho lưu trữ zip có chứa một tệp cụ thể hay không. Cho đến thời điểm này, tùy chọn duy nhất của bạn để làm như vậy là giải nén tất cả các tệp trong kho lưu trữ. Tương tự, bạn có thể chỉ cần giải nén những tệp lớn hơn kích thước cụ thể. Mô-đun
import zipfile34 cho phép chúng tôi hỏi về nội dung của kho lưu trữ mà không cần giải nén nó
Sử dụng phương thức
import zipfile35 của đối tượng ZipFile sẽ trả về danh sách tất cả các thành viên của kho lưu trữ theo tên. Để lấy thông tin về một tệp cụ thể trong kho lưu trữ, bạn có thể sử dụng phương thức
import zipfile36 của đối tượng ZipFile. Điều này sẽ cung cấp cho bạn quyền truy cập vào thông tin dành riêng cho tệp đó, chẳng hạn như kích thước nén và không nén của tệp hoặc thời gian sửa đổi lần cuối của tệp. Chúng ta sẽ quay lại vấn đề đó sau
Gọi phương thức
import zipfile36 lần lượt trên tất cả các tệp có thể là một quá trình mệt mỏi khi có nhiều tệp cần được xử lý. Trong trường hợp này, bạn có thể sử dụng phương thức
import zipfile38 để trả về danh sách chứa đối tượng
import zipfile39 cho mọi thành viên trong kho lưu trữ. Thứ tự của các đối tượng này trong danh sách giống như thứ tự của các tệp zip thực tế
Bạn cũng có thể đọc trực tiếp nội dung của một tệp cụ thể từ kho lưu trữ bằng cách sử dụng phương pháp
import zipfile40, trong đó
import zipfile41 là tên của tệp mà bạn định đọc. Để thực hiện việc này, kho lưu trữ phải được mở ở chế độ đọc hoặc nối thêm
Để lấy kích thước nén của một tệp riêng lẻ từ kho lưu trữ, bạn có thể sử dụng thuộc tính
import zipfile42. Tương tự, để biết dung lượng chưa nén, bạn có thể sử dụng thuộc tính
import zipfile43
Đoạn mã sau sử dụng các thuộc tính và phương thức mà chúng ta vừa thảo luận để chỉ trích xuất những tệp có kích thước dưới 1MB
________9____10_______
2
3
39
4
with zipfile.ZipFile['C:\\Stories\\Fantasy\\jungle.zip', 'w'] as jungle_zip:1
import zipfile5
with zipfile.ZipFile['C:\\Stories\\Fantasy\\jungle.zip', 'w'] as jungle_zip:3
import zipfile6_______14_______5
Để biết ngày giờ một tệp cụ thể từ kho lưu trữ được sửa đổi lần cuối, bạn có thể sử dụng thuộc tính
import zipfile44. Điều này sẽ trả về một bộ gồm sáu giá trị. Các giá trị sẽ là năm, tháng, ngày trong tháng, giờ, phút và giây theo thứ tự cụ thể đó. Năm sẽ luôn lớn hơn hoặc bằng năm 1980 và giờ, phút và giây là số không
1
import zipfile
2
3
39
4
42
import zipfile5
import zipfile6
45_______10_______8
47
import zipfile9
49
Thông tin này về kích thước tệp gốc và kích thước tệp nén có thể giúp bạn quyết định xem có nên nén tệp hay không. Tôi chắc chắn rằng nó cũng có thể được sử dụng trong một số tình huống khác
Đọc và ghi nội dung vào tệp
Chúng tôi đã có thể lấy được nhiều thông tin quan trọng về các tệp trong kho lưu trữ của mình bằng cách sử dụng các đối tượng
import zipfile39 của chúng. Bây giờ, đã đến lúc tiến thêm một bước và lấy nội dung thực tế của các tệp đó. Tôi đã lấy một số tệp văn bản từ trang web Project Gutenberg và tạo một kho lưu trữ với chúng. Bây giờ chúng ta sẽ đọc nội dung của một trong các tệp trong kho lưu trữ bằng cách sử dụng hàm
import zipfile46. Nó sẽ trả về các byte của tệp đã cho miễn là kho lưu trữ chứa tệp được mở để đọc. Đây là một ví dụ
1
import zipfile
2
3
4
jungle_zip.write['C:\\Stories\\Fantasy\\jungle.pdf', compress_type=zipfile.ZIP_DEFLATED]5
import zipfile5
jungle_zip.write['C:\\Stories\\Fantasy\\jungle.pdf', compress_type=zipfile.ZIP_DEFLATED]7
import zipfile6
jungle_zip.write['C:\\Stories\\Fantasy\\jungle.pdf', compress_type=zipfile.ZIP_DEFLATED]9
import zipfile8
11
import zipfile9
13
21
15
23
17
25
26
import os0
import os1
import os2
import os3
import os4
import os5
import os6
import os7
import os8
import os9
import zipfile00
import zipfile01
import zipfile02
import zipfile03
import zipfile04
import os2
Như bạn có thể thấy, hàm
import zipfile46 trả về một đối tượng bytes với tất cả nội dung của tệp mà chúng ta đang đọc. Bạn có thể thực hiện nhiều thao tác trên nội dung của tệp, chẳng hạn như tìm vị trí của bất kỳ chuỗi con nào từ một trong hai đầu của dữ liệu hoặc thực hiện thay thế thường xuyên như chúng tôi đã làm ở trên. Trong ví dụ của chúng tôi, chúng tôi đang thực hiện tất cả các hoạt động của mình với các chuỗi byte đơn giản vì chúng tôi đang đọc các tệp văn bản
Trong mô-đun cũng có một hàm
import zipfile29, nhưng nó được sử dụng để ghi các tệp vào kho lưu trữ và không tự ghi nội dung vào các tệp đó. Một cách để ghi nội dung vào các tệp cụ thể là mở chúng ở chế độ ghi bằng cách sử dụng hàm
import zipfile49 rồi sử dụng
import zipfile29 để thêm nội dung vào các tệp đó
________9____10_______
2
3
import zipfile10
4
import zipfile12
import zipfile5
import zipfile14
import zipfile6
import zipfile16
import zipfile8
import zipfile18
import zipfile9
import zipfile20
21
import zipfile22
Đoạn mã trên sẽ tạo 100 tệp văn bản với 100 bội số đầu tiên của các số đó được lưu trữ trong mỗi tệp. Chúng tôi chuyển đổi chuỗi của mình thành
import zipfile51 vì
import zipfile29 mong đợi một đối tượng giống như byte thay vì một chuỗi thông thường
Suy nghĩ cuối cùng
Như có thể thấy rõ từ hướng dẫn này, việc sử dụng mô-đun
import zipfile34 để nén tệp mang lại cho bạn rất nhiều sự linh hoạt. Bạn có thể nén các tệp khác nhau trong một thư mục vào các kho lưu trữ khác nhau dựa trên loại, tên hoặc kích thước của chúng. Bạn cũng có thể quyết định xem bạn có muốn giữ nguyên cấu trúc thư mục hay không. Tương tự, trong khi giải nén các tệp, bạn có thể giải nén chúng đến vị trí bạn muốn, dựa trên các tiêu chí của riêng bạn như kích thước, v.v.
Thành thật mà nói, tôi cũng khá thú vị khi nén và giải nén các tệp bằng cách viết mã của riêng mình. Tôi hy vọng bạn thích hướng dẫn này và nếu bạn có bất kỳ câu hỏi nào, vui lòng cho tôi biết trên diễn đàn Envato
Học Python
Tìm hiểu Python với hướng dẫn hướng dẫn Python hoàn chỉnh của chúng tôi, cho dù bạn mới bắt đầu hay bạn là một lập trình viên dày dặn đang tìm cách học các kỹ năng mới