目录
windows 直接使用 zipfile 解压的压缩包有时会是乱码,需要先编码后再使用另一种格式解码
1. 导入所需模块
import os
from pathlib import Path as p
from zipfile import ZipFile
2. 改为gbk解码格式
# 使用gbk进行解码
def support_gbk(zip_file: ZipFile):
name_to_info = zip_file.NameToInfo
# copy map first
for name, info in name_to_info.copy().items():
real_name = name.encode('cp437').decode('gbk') # zipfile默认使用的是cp437解码,而windows默认使用gbk;则先用cp437编码,再用gbk解码
if real_name != name:
info.filename = real_name
del name_to_info[name]
name_to_info[real_name] = info
return zip_file
3. 对一个zip包进行解压
# 解压文件
def unzip_file(file_origin_path):
file_target_path = file_origin_path.parent # 解压后文件保存位置
os.makedirs(file_target_path, exist_ok=True) # 若路径不存在则创建
zip_file = support_gbk(ZipFile(file_origin_path)) # 使用gbk格式解码
zip_file.extractall(file_target_path) # 文件解压缩
zip_file.close() # 关闭解压缩
4. 对所有zip包解压
def main():
zip_file_flod = p(r"E:\黑马\Python高级-全部(html版)").resolve() # zip包目录路径
zip_file_list = zip_file_flod.glob("*.zip") # 每个zip包的路径
for zip_file in zip_file_list: # 循环解压缩每个zip包
unzip_file(zip_file)
5. 所有代码
"""
windows 直接使用 zipfile 解压的压缩包会是乱码,需要先编码后再使用另一种方式解码
"""
import os
from pathlib import Path as p
from zipfile import ZipFile
# 使用gbk进行解码
def support_gbk(zip_file: ZipFile):
name_to_info = zip_file.NameToInfo
# copy map first
for name, info in name_to_info.copy().items():
real_name = name.encode('cp437').decode('gbk') # zipfile默认使用的是cp437解码,而windows默认使用gbk;则先用cp437编码,再用gbk解码
if real_name != name:
info.filename = real_name
del name_to_info[name]
name_to_info[real_name] = info
return zip_file
# 解压文件
def unzip_file(file_origin_path):
file_target_path = file_origin_path.parent # 解压后文件保存位置
os.makedirs(file_target_path, exist_ok=True) # 若路径不存在则创建
zip_file = support_gbk(ZipFile(file_origin_path)) # 使用gbk格式解码
zip_file.extractall(file_target_path) # 文件解压缩
zip_file.close() # 关闭解压缩
def main():
zip_file_flod = p(r"E:\黑马\Python高级-全部(html版)").resolve() # zip包目录路径
zip_file_list = zip_file_flod.glob("*.zip") # 每个zip包的路径
for zip_file in zip_file_list: # 循环解压缩每个zip包
unzip_file(zip_file)
if __name__ == '__main__':
main()