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"