Computer >> Máy Tính >  >> Lập trình >> Python

Cách nén tệp với mô-đun ZIPFILE bằng Python.

Vấn đề

Bạn muốn tạo tệp nén trong python.

Giới thiệu

Các tệp ZIP có thể chứa nội dung nén của nhiều tệp khác. Nén tệp làm giảm kích thước trên đĩa, điều này rất hữu ích khi truyền tệp qua internet hoặc giữa các hệ thống bằng Control-m AFT hoặc Connect direct hoặc thậm chí scp.

Các chương trình Python tạo tệp ZIP bằng các hàm trong mô-đun zipfile.

Cách thực hiện ...

1. Chúng tôi sẽ sử dụng gói zipfile và io. Cài đặt chúng bằng pip nếu bất kỳ gói nào bị thiếu trên hệ thống của bạn. Nếu bạn không chắc chắn, hãy sử dụng lệnh đóng băng pip để xác thực các gói.

2. Chúng ta sẽ viết một hàm để ghi dữ liệu mẫu vào một tệp. Hàm write_data_to_files bên dưới lấy dữ liệu làm đầu vào và tạo tệp ở tên thư mục hiện tại.

Ví dụ

 # Chức năng:write_data_to_filesdef write_data_to_files (inp_data, file_name):"" "chức năng:tạo một tệp csv với dữ liệu được chuyển đến các mã này:inp_data:dữ liệu được ghi vào tệp đích filefile_name:tên tệp đích để lưu trữ dữ liệu:noneassumption:Tệp sẽ được tạo và mã này nằm trong cùng một thư mục. "" "print (f" *** Ghi dữ liệu vào - {file_name} ") throwaway_storage =io.StringIO (inp_data) with open (file_name, 'w' ) as f:for line in throwaway_storage:f.write (line) 

3. Bây giờ chúng ta sẽ viết một hàm file_compress để nén các tệp đã tạo ở bước trên. Chức năng này chấp nhận danh sách các tệp, duyệt qua chúng và nén nó thành một tệp zip. Giải thích chi tiết của từng bước được cung cấp trong phần bình luận.

Để tạo tệp ZIP nén của riêng bạn, bạn phải mở đối tượng ZipFile ở chế độ ghi bằng cách chuyển 'w' làm đối số thứ hai.

Khi bạn chuyển một đường dẫn đến phương thức write () của một đối tượng ZipFile, Python sẽ nén tệp tại đường dẫn đó và thêm nó vào tệp ZIP.

Đối số đầu tiên cho phương thức write () là một chuỗi tên tệp cần thêm.

Đối số thứ hai là tham số kiểu nén - thông số này cho máy tính biết nó nên sử dụng thuật toán nào để nén tệp.

Ví dụ

 # Function:file_compressdef file_compress (inp_file_names, out_zip_file):"" "function:file_compressargs:inp_file_names:danh sách tên tệp được nén_zip_file:xuất tệp zip # Chọn chế độ nén ZIP_DEFLATED để nén # hoặc zipfile.ZIP_STORED để chỉ lưu trữ tệp nén =zipfile.ZIP_DEFLATEDprint (f "*** Tên tệp đầu vào được truyền để nén - {inp_file_names}") # tạo tệp zip đường dẫn / tên tham số đầu tiên , modeprint thứ hai (f '*** out_zip_file is - {out_zip_file}') zf =zipfile.ZipFile (out_zip_file, mode ="w") try:for file_to_write in inp_file_names:# Thêm tệp vào tệp zip # tệp tham số đầu tiên vào zip, tên tệp thứ hai trong zipprint (f '*** Đang xử lý tệp {file_to_write}') zf.write (tệp_to_write, tệp_to_write, nén_type =nén) ngoại trừ FileNotFoundError as e:print (f '*** Đã xảy ra ngoại lệ trong quá trình zip - { e} ') cuối cùng:# Đừng quên đóng tệp! zf.close () 

4. Chúng tôi sẽ gọi các hàm để tạo hai tệp csv và sau đó nén chúng lại. Chúng tôi sẽ sử dụng dữ liệu những người chơi quần vợt đã giành được nhiều hơn 1 danh hiệu grandlam vào một tệp - tạm thời_file1_for_zip.csv và những người chơi quần vợt đã giành được ít hơn hoặc bằng 1 HCV trong một tệp khác tạm thời_file1_for_zip.csv. Sau đó, chúng tôi sẽ nén cả hai tệp này vào tệp tạm thời.zip.

Ví dụ

 import zipfileimport ioimport pandas as pdfile_name1 ="tạm_file1_for_zip.csv" file_name2 ="tạm thời_file2_for_zip.csv" file_name_list =[file_name1, file_name2] zip_file_name ="tạm thời.zip" # data cho file 1 , 20Djokovic, 17Murray, 3 "" "# dữ liệu cho tệp 2file_data_2 =" "" trình phát, titleTheim, 1Zverev, 0Medvedev, 0Rublev, 0 "" "# ghi tệp_dữ liệu vào tệp_namewrite_data_to_files (tệp_data_1, tệp_name1) ghi_data_2, tệp_data_files_2 nén file_name thành zip_file_namefile_compress (file_name_list, zip_file_name) 

Ví dụ

5. Kết hợp mọi thứ với nhau đã thảo luận ở các bước trên.

 # Xác định dữ liệu # hãy để chúng tôi tạo một tệp zip với một tệp zip duy nhất nhập tệp zip. Nhập pandas là pd # Hàm:write_data_to_filesdef write_data_to_files (inp_data, file_name):"" "chức năng:tạo tệp csv với dữ liệu được chuyển đến các mã này :inp_data:dữ liệu được ghi vào tên tệp đích .file_name:tên tệp đích để lưu dữ liệu file_name} ") throwaway_storage =io.StringIO (inp_data) với mở (file_name, 'w') là f:cho dòng trong throwaway_storage:f.write (dòng) # Hàm:file_compressdef file_compress (inp_file_names, out_zip_file):" "" hàm :file_compressargs:inp_file_names:danh sách tên tệp được nén ra_zip_file:đầu ra tệp zip =zipfile.ZIP_DEFLA TEDprint (f "*** Tên tệp đầu vào được truyền để nén - {inp_file_names}") # tạo tệp zip đường dẫn / tên tham số đầu tiên, modeprint thứ hai (f '*** out_zip_file is - {out_zip_file}') zf =zipfile. ZipFile (out_zip_file, mode ="w") try:for file_to_write in inp_file_names:# Thêm tệp vào tệp zip # tệp tham số đầu tiên vào zip, tên tệp thứ hai trong zipprint (f '*** Đang xử lý tệp {file_to_write}') zf. ghi (tệp_to_write, tệp_to_write, nén_type =nén) ngoại trừ FileNotFoundError as e:print (f '*** Exception xảy ra trong quá trình nén - {e}') cuối cùng:# Đừng quên đóng tệp! zf.close () # __main__ programmif __name__ =='__main __':# Xác định tên tệp của bạn và datafile_name1 ="tạm_tệp1_for_zip.csv" file_name2 ="tạm_tệp2_for_zip.csv" file_name_list =[file_name1, file_name2] zip_file_name ="" tạm thời. player , titleFederer, 20Nadal, 20Djokovic, 17Murray, 3 "" "file_data_2 =" "" player, titleTheim, 1Zverev, 0Medvedev, 0Rublev, 0 "" "# ghi file_data sang file_namewrite_d ata_to_files (file_data_1, file_name1) write_data_to_files (file_data_2, file_name2) # zip file_name sang zip_file_namefile_compress (file_name_list, zip_file_name) 
 *** Ghi dữ liệu vào - tạm_tệp1_for_zip.csv *** Ghi dữ liệu vào - tạm_tệp2_for_zip.csv *** Tên tệp đầu vào được chuyển để nén - ['tạm_tệp1_for_zip.csv', 'tạm_tệp2_for_zip.csv'] ** * out_zip_file là - tạm thời.zip *** Đang xử lý tệp tạm thời_file1_for_zip.csv *** Đang xử lý tệp tạm thời_file2_for_zip.csv 

Đầu ra

Khi đoạn mã trên được thực thi, kết quả đầu ra là

  • tạm thời_file1_for_zip.csv được tạo trong thư mục hiện tại.

  • tạm thời_file2_for_zip.csv được tạo trong thư mục hiện tại.

  • Tệp tạm thời.zip được tạo trong thư mục hiện tại.