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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 08:09:42