Cách nén và giải nén tệp bằng bằng mô-đun zipfile của Python

Cách nén và giải nén tệp bằng bằng mô-đun zipfile của Python

Chia sẻ kiến thức 19/02/2023

Nếu bạn đang tạo ứng dụng xử lý tệp, hãy cân nhắc về việc sử dụng zip để tiết kiệm dung lượng.

Zip là một cách đơn giản để nén và kết hợp nhiều tệp thành một tệp duy nhất. Điều này không chỉ giúp tiết kiệm không gian lưu trữ mà còn cả băng thông khi truyền tệp qua mạng. Một trong những tính năng tốt nhất của zip là nó hoạt động trên tất cả các nền tảng chính: Windows, Linux và Mac.

Zip sử dụng nén không mất dữ liệu (lossless compression) để giữ lại tất cả dữ liệu khi nén và giải nén. Bạn cũng có thể mã hóa và giải mã các tệp zip của mình.

 

Cùng FUNiX tìm hiểu cách bạn có thể đọc, nén và giải nén tệp bằng mô-đun zipfile của Python.

Mô-đun zipfile là gì?

Bạn có thể dùng mô-đun zipfile tiêu chuẩn để thao tác với các tệp zip bằng Python. Với mô-đun này, bạn có thể mở và đọc các tệp zip, đọc siêu dữ liệu của chúng, tạo tệp zip, nén và giải nén tệp. Có ba phương pháp nén: Deflate, Bzip2 và LZMA.

Một trong những hạn chế của mô-đun này là khả năng xử lý các tệp đa đĩa, nhưng nó có thể xử lý phần mở rộng ZIP64. Nó cũng có thể giải mã các file zip nhưng không mã hóa chúng. Sử dụng mô-đun zipfile, bạn có thể lấy siêu dữ liệu của tệp zip, chẳng hạn như ngày và thời gian sửa đổi. Bạn cũng có thể lấy các chi tiết như hệ điều hành được sử dụng để tạo tệp, phiên bản zip và kích thước tệp ở cả định dạng nén và không nén.

Cách nén tệp bằng Python

Bạn có thể nén nhiều tệp vào một tệp zip bằng mô-đun zipfile của Python. Nhập mô-đun ZipFile từ gói zipfile để thực hiện các thao tác zip cần thiết. Đồng thời nhập mô -đun os để chọn và lưu tệp.

 

Xác định hàm get_all_file_paths(). Nó sẽ chấp nhận một tham số thư mục chứa đường dẫn đến thư mục chứa các tệp cần nén.

Tạo một danh sách trống sẽ lưu trữ danh sách đường dẫn tệp. Sử dụng vòng lặp for để lấy toàn bộ nội dung của thư mục đích bằng hàm os.walk(). Hàm này tìm nạp tên tệp trong cây thư mục bằng cách di chuyển dọc theo nó theo cách tiếp cận từ trên xuống hoặc từ dưới lên. Đối với mỗi thư mục, hàm trả về ba tuple chứa root, dirs, và files.

Root là một chuỗi chứa đường dẫn đầy đủ đến thư mục. Danh sách dirs bao gồm tất cả các thư mục con có trong thư mục. Danh sách files chứa tất cả các tệp có trong thư mục.

Bên trong vòng lặp, khai báo một vòng lặp khác để lặp lại danh sách tệp. Sử dụng hàm os.path.join() để kết hợp tên của thư mục với từng tên tệp để tạo thành một đường dẫn hoàn chỉnh. Sau đó, nối tên tệp hoàn chỉnh này vào danh sách bạn đã tạo trước đó. Khi thao tác này kết thúc, trả về danh sách đường dẫn tệp.

 
# import the required modules
from zipfile import ZipFile
import os

# create a function to get all the file paths
def get_all_file_paths(directory):
    # initializing empty list to store file paths
    file_paths = []

    # navigate through the files
    for root, directories, files in os.walk(directory):
        for filename in files:
            # join the root and filename to create a complete file path
            filepath = os.path.join(root, filename)
            file_paths.append(filepath)

    # returning all file paths
    return file_paths

Lưu trữ đường dẫn đến thư mục chứa các tệp bạn muốn nén trong một biến có tên là directory (thư mục). Gọi hàm get_all_file_paths() mà bạn đã tạo trước đó và lưu trữ giá trị mà nó trả về trong file_paths.

Hiển thị thông báo để người dùng biết rằng đây là các tệp mà chương trình sẽ nén. Lặp lại các tệp và hiển thị tên của chúng.

Chuyển tên mà bạn muốn tệp zip của mình có cùng với lệnh chương trình trả về tệp có thể ghi (writable file) bằng cách sử dụng câu lệnh with để xử lý các trường hợp ngoại lệ. Lặp lại từng tệp và sử dụng hàm write() trên tệp có thể ghi thành tệp zip.

Khi operation hoàn tất, xuất ra thông báo rằng chương trình đã nén tất cả các tệp thành công.

# path to folder you want to zip
directory = './pythonzip'
# calling function to get all file paths in the directory
file_paths = get_all_file_paths(directory)

# printing the list of all files you want to zip
print('List of files that will be zipped:')

for file_name in file_paths:
    print(file_name)

# writing files to a zipfile
with ZipFile('my_file.zip', 'w') as zip:
    # write each file one by one
    for file in file_paths:
        zip.write(file)

print('All files are zipped!')

Cách giải nén tệp bằng Python

Việc triển khai giải nén tệp bằng mô-đun zipfile dễ dàng hơn rất nhiều. Nhập gói zipfile từ mô-đun ZipFile và lưu trữ tên của tệp zip bạn muốn giải nén trong một biến. Sử dụng câu lệnh with để xử lý các ngoại lệ và mở tệp bạn muốn giải nén ở chế độ đọc. Sử dụng hàm printdir() để hiển thị mục lục của các tệp có trong zip.

Hiển thị thông báo tiến trình cho biết bạn đang giải nén tệp và sử dụng hàm extractall() để trích xuất nội dung của tệp zip vào thư mục làm việc hiện tại. Ngoài ra, bạn có thể bao gồm tham số đường dẫn để thay đổi đường dẫn nơi chương trình giải nén các tệp.

Hiển thị thông báo bằng cách sử dụng câu lệnh print khi hoàn thành thao tác.

# importing the required modules
from zipfile import ZipFile

# pass the name of the zip file you want to extract
file_name = "extract.zip"
# opening the zip file in read mode
with ZipFile(file_name, 'r') as zip:
    # display the contents of the zip file
    zip.printdir()

    # extracting all the files
    print('Extract in progress...')
    zip.extractall()
    print('All files are extracted!')

Vân Nguyễn

Dịch từ: https://www.makeuseof.com/python-zip-unzip-files/

ĐĂNG KÝ TƯ VẤN HỌC LẬP TRÌNH TẠI FUNiX

Bình luận (
0
)

Bài liên quan

  • Tầng 0, tòa nhà FPT, 17 Duy Tân, phường Cầu Giấy, Hà Nội
  • info@funix.edu.vn
  • 0782313602 (Zalo, Viber)        

Cơ quan chủ quản: Công ty Cổ phần Giáo dục Trực tuyến FUNiX
MST: 0108171240 do Sở kế hoạch và Đầu tư thành phố Hà Nội cấp ngày 27 tháng 02 năm 2018
Địa chỉ:
Văn phòng Hà Nội: Tầng 4, Tòa nhà 25T2, Đường Nguyễn Thị Thập, phường Yên Hòa, Hà Nội.
Văn phòng TP.HCM: Lầu 8, Tòa nhà Giày Việt Plaza 180-182 Lý Chính Thắng, phường Nhiêu Lộc, TP. Hồ Chí Minh.
Hotline: 078 231 3602 – Email: info@funix.edu.vn

yêu cầu gọi lại