Python使用pyvips批量转换.jp2为.jpg时代码无限运行无报错如何解决
问题根源
代码无限执行且不报错的核心原因如下:
- 没有做
.jp2后缀筛选,会遍历目录下所有格式的文件执行转换;如果输出的jpg文件保存在当前遍历的目录中,程序会不断读取新生成的jpg文件,再生成文件名带更多冗余字符的新jpg,进入无限生成循环。 - 输出文件路径没有拼接指定的源目录,默认输出到脚本运行的工作路径,且文件名拼接时多写了多余的
j字符,属于笔误。 - 直接用字符串切片切除后缀的方式鲁棒性差,遇到文件名本身带
.的情况会切错;Windows路径未做原始字符串标记,容易触发反斜杠转义导致路径识别异常。
修正后可直接运行的代码
import os import pyvips # Windows路径前加r标记为原始字符串,避免反斜杠转义问题 source_dir = r'D:\Anaconda\data' # 可自定义输出目录,不想单独存储可直接和源目录保持一致 output_dir = r'D:\Anaconda\data\jpg_result' # 输出目录不存在时自动创建 os.makedirs(output_dir, exist_ok=True) for filename in os.listdir(source_dir): source_path = os.path.join(source_dir, filename) # 跳过子文件夹,仅处理文件 if not os.path.isfile(source_path): continue # 仅处理.jp2后缀文件,兼容大写后缀场景 if not filename.lower().endswith('.jp2'): continue try: # 读取jp2格式文件 img = pyvips.Image.new_from_file(source_path) # 安全分离文件名和后缀,避免文件名带.时切错 file_stem, _ = os.path.splitext(filename) # 拼接输出完整路径,修正多余的j字符,输出文件名和原文件主名一致 output_path = os.path.join(output_dir, f'{file_stem}.jpg') # 保存为jpg,Q参数可调整画质,范围1-100,数值越高画质越好文件越大 img.write_to_file(output_path, Q=90) print(f'转换完成: {filename} -> {file_stem}.jpg') except Exception as e: print(f'文件{filename}转换失败,错误信息: {str(e)}') continue
关键修改说明
- 新增
.jp2后缀校验逻辑,仅处理目标格式文件,从根源避免重复读取生成的jpg导致的无限循环 - 单独配置输出目录,自动创建不存在的目录,避免输出文件混在源目录被重复扫描;如果需要直接输出到源目录,把
output_dir变量值改成和source_dir一致即可 - 用
os.path.splitext()替代硬编码字符串切片分离文件名和后缀,兼容带.的复杂文件名 - Windows路径前加
r标记为原始字符串,避免反斜杠转义导致路径识别错误 - 修正原代码文件名拼接时多余的
j字符,输出文件和原文件主名一致,仅替换后缀为.jpg - 新增异常捕获逻辑,单个文件损坏、转换失败不会中断整个批量流程,打印错误信息后自动继续处理下一个文件
- 新增转换进度打印,可实时看到处理状态
- 开放jpg画质配置参数,可根据需求调整输出文件的画质和体积平衡
内容的提问来源于stack exchange,提问作者kanishka dubey
相关产品推荐
相关产品推荐

