python批量解压压缩包

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')

代价详解

  1. 导入所需模块
    import os
    import zipfile
    
    • os 模块用于与操作系统进行交互,比如文件路径的操作
    • zipfile 模块用于处理zip文件的压缩和解压缩
  2. 定义函数 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"
  3. 打开zip文件
    with zipfile.ZipFile(zip_file_path,'r') as zip_ref:
    
    • 使用zipfile.ZipFile()打开指定路径的ZIP文件,并以只读模型打开(‘r’)
    • with 语句确保ZIP文件在使用后会被正确关闭
  4. 遍历ZIP文件中的每个文件
    for file_info in zip_ref.infolist():
    
    • zip_ref.infolist() 返回ZIP文件中所有文件的信息列表
    • 通过 for 循环遍历这个列表中的每个文件信息对象 file_info
  5. 获取原始文件名
    original_filename = file_info.filename
    
    • file_info.filename是ZIP文件中每个文件的原始文件名
  6. 解压文件到临时路径
    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。
  7. 处理文件名编码
    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编码时的情况。
  8. 重命名文件以匹配正确的编码
    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"
    • 然后,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"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值