You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python批量转换文件为bz2格式时重复压缩已转换文件问题求解

问题根因
  • bat文件逻辑错误:Python脚本原本设计为逐文件调用转换,但bat脚本接收到单个文件路径后,错误地遍历了同目录下所有相同后缀的文件批量压缩,而非只处理传入的单个文件。这导致大量未被Python逻辑校验的文件被提前压缩,且这些文件的源文件不会被Python删除,后续会被重复处理。如果遇到无后缀的文件,bat会匹配目录下所有文件,包括已经生成的.bz2压缩包,直接导致出现.bz2.bz2的重复压缩后缀。
  • 原有Python代码存在缩进错误:convert函数下的两行代码缺少缩进,运行时会直接报错。
修复方案

1. 重写packany.bat,仅处理传入的单个文件

完全删除原有批量遍历逻辑,仅响应Python传入的单个文件路径,避免超出预期的批量压缩:

@echo off
"C:\Program Files\7-Zip\7z.exe" a -tbzip2 "%~1.bz2" "%~1" -mx9

2. 修复并优化Python逻辑

修复缩进问题的同时增加双重校验,避免路径带空格、大小写后缀漏判、文件丢失等问题:

import os
import subprocess
from progress.bar import ChargingBar

data_folder = r"C:\Users\luisb\Auto_Packer_Gmod\d"

def convert(filename):
    FNULL = open(os.devnull, 'w')
    # 引号包裹文件名,避免路径带空格时报错
    subprocess.run(f'packany.bat "{filename}"', stdout=FNULL, stderr=subprocess.STDOUT, shell=True)
    # 确认压缩文件生成成功后再删除源文件,避免文件丢失
    if os.path.exists(f"{filename}.bz2"):
        os.remove(filename)

def getListOfFiles(dirName):
    allFiles = list()
    for entry in os.listdir(dirName):
        fullPath = os.path.join(dirName, entry)
        if os.path.isdir(fullPath):
            allFiles.extend(getListOfFiles(fullPath))
        else:
            # 提前过滤.bz2后缀,兼容大小写格式
            if not fullPath.lower().endswith('.bz2'):
                allFiles.append(fullPath)
    return allFiles

def packer():
    data = getListOfFiles(data_folder)
    bar = ChargingBar('Processing', max=len(data), suffix = '%(percent).1f%% - %(index)d/%(max)d')
    bar.start()
    for i in data:
        # 处理前二次校验,避免时序问题导致误处理已生成的压缩包
        if os.path.exists(i) and not i.lower().endswith('.bz2'):
            convert(i)
        bar.next()
    bar.finish()

packer()

内容的提问来源于stack exchange,提问作者Luis Blüml

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 17:36:02