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
相关产品推荐
相关产品推荐

