2025年1月23日
python如何批量解压压岁包
代码为
import os
import zipfile
def unzip_with_correct_encoding(zip_file_path, extract_to, encoding="utf-8"):
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
for file_info in zip_ref.infolist():
# 获取原始文件名
original_filename = file_info.filename
# 解压文件到临时路径
temp_path = os.path.join(extract_to, original_filename)
zip_ref.extract(file_info, extract_to)
# 处理文件名编码
if encoding.lower() == "gbk":
new_filename = original_filename.encode('cp437').decode('gbk')
else:
new_filename = original_filename.encode('utf-8').decode('utf-8')
if original_filename != new_filename:
os.rename(temp_path, os.path.join(extract_to, new_filename))
# 示例用法
zip_file_path = "./XXX.zip"
extract_to = "./test"
unzip_with_correct_encoding(zip_file_path, extract_to, encoding='gbk')
代价详解
- 导入所需模块
import os import zipfile
- os 模块用于与操作系统进行交互,比如文件路径的操作
- zipfile 模块用于处理zip文件的压缩和解压缩
- 定义函数 unzip_with_correct_encoding
def unzip_with_correct_encoding(zip_file_path,extract_to,encoding="utf-8"):
- 该函数接受三个参数:
- zip_file_path:要解压的zip文件的路径
- extract_to:解压后文件存放的目标文件夹路径
- encoding:用于处理文件名编码的字符集,默认为"utf-8",但也可以指定为"gbk"
- 该函数接受三个参数:
- 打开zip文件
with zipfile.ZipFile(zip_file_path,'r') as zip_ref:
- 使用zipfile.ZipFile()打开指定路径的ZIP文件,并以只读模型打开(‘r’)
- with 语句确保ZIP文件在使用后会被正确关闭
- 遍历ZIP文件中的每个文件
for file_info in zip_ref.infolist():
- zip_ref.infolist() 返回ZIP文件中所有文件的信息列表
- 通过 for 循环遍历这个列表中的每个文件信息对象 file_info
- 获取原始文件名
original_filename = file_info.filename
- file_info.filename是ZIP文件中每个文件的原始文件名
- 解压文件到临时路径
temp_path = os.path.join(extract_to,original_filename) zip_ref.extract(file_info,ex)
- os.path.join(extract_to,original_filename)用于构建解压后文件的完整路径
- zip_ref.extract(file_info,extract_to)将文件解压到指定的目标文件夹extract_to,此时文件名为original_filename。
- 处理文件名编码
if encoding.lower() == "gbk": new_filename = original_filename.encode('cp437').decode('gbk') else: new_filename = original_filename.encode('utf-8').decode('utf-8')
- 根据传入的 encoding 参数来决定如何处理文件名编码。
- 如果 encoding 为 “gbk”(不区分大小写),则将文件名从默认的CP437编码转换为GBK编码。
- 否则,默认认为文件名已经是UTF-8编码,直接进行编码转换以确保编码一致。这里两种情况下实际效果相同,但主要目的是为了处理当文件名编码为CP437且需要GBK编码时的情况。
- 重命名文件以匹配正确的编码
if original_filename != new_filename: os.rename(temp_path, os.path.join(extract_to, new_filename))
- 如果解压前后的文件名(因编码转换)不一致,则使用 os.rename() 函数将解压后的文件名从 original_filename 改为 new_filename
temp_path的作用
- 处理编码问题
- 在构建 temp_path 后,后续的编码处理和文件重命名操作都基于这个路径。
- 如果文件名需要从CP437编码转换为GBK编码(或其他编码),我们可以先解压文件到这个临时路径,然后再进行重命名操作。
- 举例说明
- 假设你有以下参数:
zip_file_path = "XXX.zip"
extract_to = "./test"
original_filename = "????.txt"
- 执行
temp_path = os.path.join(extract_to,original_filename)
后:- temp_path会被设置为
"./test/????.txt"
- temp_path会被设置为
- 然后,
zip_ref.extract(file_info,extract_to)
会将 ???.txt 文件解压到./test
文件夹中,路径为./test/????.txt
- 接下来,如果需要处理文件名的编码问题:
- 如果 encoding 是 “gbk”,原始文件名
????.txt
可能会从CP437编码转换为GBK编码。 - 如果文件名确实需要转换,会生成一个新的文件名 new_filename,然后使用
os.rename(temp_path, os.path.join(extract_to, new_filename))
将文件从 temp_path 重命名为 new_filename。
后使用os.rename(temp_path, os.path.join(extract_to, new_filename))
将文件从 temp_path 重命名为 new_filename。 - 然后temp_path会被设置为
"./test/example.txt"
- 如果 encoding 是 “gbk”,原始文件名
- 假设你有以下参数: