Windows 11下Python Pillow批量压缩JPG脚本无报错中途停止问题
脚本中途随机停止的原因及修复方案
1. 文件访问冲突(Windows系统特有)
Windows后台进程(如资源管理器缩略图缓存、杀毒软件实时扫描)可能锁定部分图片文件,导致Pillow写入时触发底层IO异常,这类异常可能无法被Python的Exception捕获,直接终止脚本。
修复:
- 添加重试逻辑,应对临时锁定:
import time # 替换原文件处理的try代码块 max_retries = 3 success = False for attempt in range(max_retries): try: with Image.open(filepath) as img: if img.mode in ('RGBA', 'P'): img = img.convert('RGB') img.save(filepath, 'JPEG', quality=quality, optimize=True) success = True break except Exception as e: if attempt == max_retries -1: print(f"处理失败({max_retries}次重试后):{filepath} - {str(e)}") else: time.sleep(1) if success: processed +=1 print(f"已压缩:{filepath}") - 临时关闭杀毒软件实时扫描,或将目标文件夹加入白名单。
2. 损坏/异常格式的JPG文件
部分JPG存在格式损坏(如文件头缺失、编码异常),Pillow处理这类文件时可能直接崩溃,而非抛出Python可捕获的异常。
修复:
- 先校验文件有效性,过滤无效JPG:
import imghdr # 修改文件判断逻辑 if filename.lower().endswith(('.jpg', '.jpeg')): if imghdr.what(filepath) != 'jpeg': print(f"无效JPG文件:{filepath}") continue # 后续处理逻辑
3. 控制台输出缓冲溢出
处理大量图片时,连续的print输出可能触发Windows控制台缓冲溢出,导致脚本无响应停止。
修复:
- 改用日志文件记录输出,避免控制台压力:
import logging # 在脚本开头初始化日志 logging.basicConfig( filename='压缩日志.log', level=logging.INFO, format='%(asctime)s - %(message)s', encoding='utf-8' ) # 用logging.info替代print logging.info(f"已压缩:{filepath}")
4. 目录遍历过程中结构变化
若遍历期间有其他程序修改目标文件夹(新增/删除文件),os.walk可能出现隐性错误,导致遍历终止。
修复:
- 先一次性收集所有JPG路径,再批量处理:
# 替换原遍历逻辑 jpg_paths = [] for root, _, files in os.walk(directory): for fname in files: if fname.lower().endswith(('.jpg', '.jpeg')): jpg_paths.append(os.path.join(root, fname)) # 逐个处理收集到的路径 for filepath in jpg_paths: # 原文件处理逻辑
内容的提问来源于stack exchange,提问作者Lorenzo T
相关产品推荐
相关产品推荐

