Nén tệp Python

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]
5

Nế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 zipfile
23 và
import zipfile
24 đã đượ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 zipfile
25. 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 zipfile
4
import zipfile
5
import zipfile
6
import zipfile
7
import zipfile
8
import zipfile
9
2
0
2
1
2
2
2
3
2
4
2
5_______11_______6_______11_______7

Lần này, chúng tôi đã nhập mô-đun

import zipfile
26 và sử dụng phương pháp
import zipfile
27 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 zipfile
28

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
2
9

Phương thức

import zipfile
29 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 zipfile
30 để 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 zipfile
30 để 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 zipfile
32 thay vì
import zipfile
30. Đâ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
3
4

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 zipfile
34 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 zipfile
35 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 zipfile
36 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 zipfile
36 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 zipfile
38 để trả về danh sách chứa đối tượng
import zipfile
39 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 zipfile
40, trong đó
import zipfile
41 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 zipfile
42. Tương tự, để biết dung lượng chưa nén, bạn có thể sử dụng thuộc tính
import zipfile
43

Đ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
3
9
4
with zipfile.ZipFile['C:\\Stories\\Fantasy\\jungle.zip', 'w'] as jungle_zip:
1
import zipfile
5
with zipfile.ZipFile['C:\\Stories\\Fantasy\\jungle.zip', 'w'] as jungle_zip:
3
import zipfile
6_______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 zipfile
44. Đ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
3
9
4
4
2
import zipfile
5
import zipfile
6
4
5_______10_______8
4
7
import zipfile
9
4
9

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 zipfile
39 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 zipfile
46. 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 zipfile
5
    jungle_zip.write['C:\\Stories\\Fantasy\\jungle.pdf', compress_type=zipfile.ZIP_DEFLATED]
7
import zipfile
6
    jungle_zip.write['C:\\Stories\\Fantasy\\jungle.pdf', compress_type=zipfile.ZIP_DEFLATED]
9
import zipfile
8
1
1
import zipfile
9
1
3
2
1
1
5
2
3
1
7
2
5
2
6
import os
0
import os
1
import os
2
import os
3
import os
4
import os
5
import os
6
import os
7
import os
8
import os
9
import zipfile
00
import zipfile
01
import zipfile
02
import zipfile
03
import zipfile
04
import os
2

Như bạn có thể thấy, hàm

import zipfile
46 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 zipfile
29, 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 zipfile
49 rồi sử dụng
import zipfile
29 để thêm nội dung vào các tệp đó

________9____10_______

2
3
import zipfile
10
4
import zipfile
12
import zipfile
5
import zipfile
14
import zipfile
6
import zipfile
16
import zipfile
8
import zipfile
18
import zipfile
9
import zipfile
20
2
1
import zipfile
22

Đ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 zipfile
51 vì
import zipfile
29 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 zipfile
34 để 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

Làm cách nào để gzip một tệp trong Python?

Để nén một tệp hiện có vào kho lưu trữ gzip, hãy đọc văn bản trong đó và chuyển đổi nó thành một mảng phụ . Đối tượng bytearray này sau đó được ghi vào tệp gzip. Trong ví dụ dưới đây, 'zen. txt' được cho là có trong thư mục hiện tại.

Tôi có thể giảm kích thước tệp bằng zip không?

Bạn có thể nén hoặc nén tệp trong Windows, thao tác này sẽ thu nhỏ kích thước của tệp nhưng vẫn giữ được chất lượng ban đầu của bản trình bày . Bạn cũng có thể nén các tệp phương tiện trong bản trình bày để chúng có kích thước tệp nhỏ hơn và dễ gửi hơn.

Làm thế nào để gzip một tập tin?

Cách cơ bản nhất để sử dụng gzip để nén tệp là gõ. .
% gzip tên tệp. .
% gzip -d tên tệp. gz hoặc % tên tệp gunzip. gz. .
% tar -cvf lưu trữ. tar foo bar dir/.
% tar -xvf lưu trữ. hắc ín. .
% tar -tvf lưu trữ. hắc ín. .
% tar -czvf kho lưu trữ. hắc ín. gz file1 file2 dir/.
% tar -xzvf kho lưu trữ. hắc ín. gz. .
% tar -tzvf kho lưu trữ. hắc ín. gz

Sự khác biệt giữa gzip và zip là gì?

Zip có thể nén nhiều tệp và thậm chí toàn bộ hệ thống phân cấp thư mục. gzip, mặt khác, chỉ nén một tệp duy nhất . Đó là lý do tại sao chúng tôi thường sử dụng nó với tar, đóng gói nhiều tệp/thư mục vào một tệp lưu trữ duy nhất.

Chủ Đề