/*auto readmore*/ /*auto readmore*/ /* an hien script*/ // an hien password /*an hien ma chuong trinh cong tru */ /*Scrollbox thanh cuon*/ /***Nhung CODE***/ /* dòng xanh dòng trắng */ /* https://cdnjs.com/libraries/prism lay thu vien, can vao ten file ma goi 1. copy link vao vi du:prism-python.min.js 2. ten ngon nua la python */ /*=== New posts ===*/ /*header slider*/ /*=== bai viet lien quan===*/ /*===tabcode===*/

Network Automation #013 - Create/Unzip/Extract A ZIP Archive File In Python - Tạo/Bung/Giải File ZIP Trong Python

 YÊU CẦU

1. Viết hàm nén/tạo file ZIP:

a. Một loại định dạng file ở thư mục hiện tại.
b. Tất cả các file, đường dẫn tự truyền vào
c. Một loại định dạng file nhất định, đường dẫn và loại file được truyền vào
d. Thêm file vào file ZIP đã tồn tại

         

2. Viết hàm giải nén/extract file ZIP


THỰC HIỆN:

1. Viết hàm nén/tạo file ZIP:

a. Một loại định dạng file ở thư mục hiện tại.
'''
Tạo file nén ở thư mục hiện tại, file tự truyền vào.
Ví dụ chỉ nén các file *.py:
to_zip("abc",".py")
hoặc to_zip("abc1","csv")
'''
import os
from zipfile import ZipFile
from datetime import datetime
import zipfile

def to_zip(zip_file, type_file): # Hàm tạo file zip
	path = os.getcwd()  # lấy đường dẫn hiện tại	
	zip_file = zip_file + ".zip"
	if not os.path.isfile(zip_file):
   		zf = ZipFile(zip_file, "w")
	else: # Nếu file đã tồn tại thì không ghi header
   		zf = ZipFile(zip_file, "a")
	for file in os.listdir(os.curdir): # tương đương lệnh dir trong cmd của windows, liệt kê file, folder trong thư mục hiện tại
	    if file.endswith(type_file) and os.path.isfile(os.curdir + '/' + file): # đảm bảo đúng là file, và file có định dạng được đưa vào từ type_file
	       	#print(file) # Liệt kê các file cần nén
	       	zf.write(file)

	zf.close()
	print (f"***Please check files '{zip_file}' at '{path}' ***\n")		

# Gọi hàm zip
to_zip("abc",".py")
to_zip("abc1","csv")

 

b. Tất cả các file, đường dẫn tự truyền vào
'''
Nén tất cả các file ở thư mục
ví dụ nén tất cả các file tại đường dẫn "C:\Intel" thành file có tên abc123.zip:
to_zip_dir("abc123.zip", r"C:\Intel")
'''
from zipfile import ZipFile
import os
from os.path import basename
from pprint import pprint # dùng để in ra đẹp, dễ nhìn hơn

def to_zip_dir(zip_file, dir_name): # Hàm nén tất cả các file trong thư mục
    path = os.getcwd()  # lấy đường dẫn hiện tại    path = os.getcwd()  # lấy đường dẫn hiện tại    
    with ZipFile(zip_file, 'w') as zipObj:
       for folder_Name, sub_folders, file_names in os.walk(dir_name): # lấy thông tin của file, folder tại đường dẫn dir_name
           #pprint(list(os.walk(dir_name)) )
           for file_name in file_names:
               filePath = os.path.join(folder_Name, file_name) # đường dẫn đầy đủ đến file cần backup
               zipObj.write(filePath, basename(filePath)) # thực hiện nén file
    print (f"***Please check files '{zip_file}' at '{path}' ***\n")            

#gọi hàm nén file
to_zip_dir("abc123.zip", r"C:\Intel")

 

c. Một loại định dạng file nhất định, đường dẫn và loại file được truyền vào 
'''
Ví dụ:
Thực hiện nén các file *.py tại đường dẫn "C:\Intel" thành file có tên abcde.zip:
to_zip_filter("abcde.zip",r"C:\Intel","py")

Thực hiện nén các file *.* tại đường dẫn "C:\Intel" thành file có tên abcdef.zip:
to_zip_filter("abcdef.zip",r"C:\Intel","")
'''
from zipfile import ZipFile
import os
from os.path import basename
from pprint import pprint # dùng để in ra đẹp, dễ nhìn hơn

def to_zip_filter(zip_file, dir_name, type_file): # Hàm nén (filter) file trong thư mục
    path = os.getcwd()  # lấy đường dẫn hiện tại    path = os.getcwd()  # lấy đường dẫn hiện tại    
    with ZipFile(zip_file, 'w') as zipObj:
       for folder_Name, sub_folders, file_names in os.walk(dir_name): # lấy thông tin của file, folder tại đường dẫn dir_name
           #pprint(list(os.walk(dir_name)) )
           for file_name in file_names:
               if file_name.endswith(type_file): # tên file tận cùng là ...
                 filePath = os.path.join(folder_Name, file_name) # đường dẫn đầy đủ đến file cần backup
                 zipObj.write(filePath, basename(filePath)) # thực hiện nén file
    print (f"***Please check files '{zip_file}' at '{path}' ***\n")            
         
to_zip_filter("abcde.zip",r"C:\Intel","py") # tất cả các file *.py
to_zip_filter("abcdef.zip",r"C:\Intel","") # tất cả các file


d. Thêm file vào file ZIP đã tồn tại


def add_tozip (path, file_name):
	with zipfile.ZipFile(rf"{path}\File_ZIP_DangTonTai.zip", 'a') as zipf: # Mở file zip tại đường dẫn, nếu file chưa có tạo mới file
    # Thêm file source_path vào destination
    # Nếu file đã có sẽ ghi đè
    

	    source_path = rf"{path}\{file_name}" 
	    destination = rf"{file_name}"
	    zipf.write(source_path, destination) # thực hiện việc ghi file, nếu có ghi đè (nhưng chương trình sẽ thông báo)

2. Viết hàm giải nén/extract file ZIP

'''
Giải nén file zip
Ví dụ:
- zip_extract(r"C:\Intel\now.zip", "abc.csv", r"C:\Intel") # tìm file abc.csv trong file "C:\Intel\now.zip" và extract đến đường dẫn "C:\Intel"
- zip_extract(r"C:\Intel\now.zip", "", r"C:\Intel") # Giải nén tất cả các file trong file "C:\Intel\now.zip" và extract đến đường dẫn "C:\Intel"

'''
import os
from zipfile import ZipFile
from datetime import datetime
import zipfile

def zip_extract(zip_file, type_file, to_dir): #Hàm giải nén file zip
	#zip_file = zip_file + ".zip"
	with ZipFile(zip_file, 'r') as zip:
		if type_file == "all" or type_file == "*" or type_file == "":
		    print('Extracting all the files ...')
		    zip.printdir()# in thông tin các file có trong file zip
		    zip.extractall(to_dir) # extract tất cả các file
		else: 
			zip.extract(type_file, to_dir) # extract 1 file với tên file mới truyền vào
	
	print (f"***Please check files '{type_file}' at '{to_dir}' ***\n")		

# cách gọi hàm    	
zip_extract(r"C:\Intel\now.zip", "abc.csv", r"C:\Intel") # tìm file abc.csv trong file "C:\Intel\now.zip" và extract đến đường dẫn "C:\Intel"
zip_extract(r"C:\Intel\now.zip", "", r"C:\Intel") # Giải nén tất cả các file trong file "C:\Intel\now.zip" và extract đến đường dẫn "C:\Intel"


Xong!

No comments:

Post a Comment

/*header slide*/