Python使用DBR扫描文件遇错循环终止,需实现跳过错误文件功能
解决DBR条码扫描循环遇错终止的问题
问题根源
- 原代码的
try-except包裹了整个循环,单个文件处理出错会直接终止整个循环,无法继续处理后续文件。 - 当文件无法识别条码时,
reader.decode_file()返回None,后续遍历results会触发TypeError: 'NoneType' object is not iterable,且原代码未捕获该类型错误。 - 仅捕获
BarcodeReaderError,未覆盖文件读取错误、类型错误等其他可能的异常。
修正方案
将错误捕获逻辑移至单个文件处理的循环内部,确保单个文件出错时跳过该文件,继续处理后续文件;同时增加结果判空和多类型异常捕获。
修改后的完整代码
import glob import pandas as pd from dbr import BarcodeReader, BarcodeReaderError image_path = 'C:/Users/username/Samples/' image_list = glob.glob(image_path + '*') barcodes = {} # 初始化BarcodeReader(原代码缺失,需补充) reader = BarcodeReader() # 若需要激活密钥,添加以下代码: # reader.init_license("你的DBR密钥") for idx, file_path in enumerate(image_list): try: results = reader.decode_file(file_path) # 先检查是否识别到条码,避免遍历None引发错误 if results is None: print(f"跳过文件: {file_path.replace(image_path, '')}(未识别到条码)") continue for result in results: # 存储文件名和对应的条码文本 barcodes[file_path.replace(image_path, '')] = result.barcode_text print(f"已处理: {file_path.replace(image_path, '')}") except BarcodeReaderError as bre: print(f"跳过文件: {file_path.replace(image_path, '')}(DBR错误: {bre})") continue except TypeError as te: print(f"跳过文件: {file_path.replace(image_path, '')}(类型错误: {te})") continue except Exception as e: # 捕获其他未预料的异常,保证循环不中断 print(f"跳过文件: {file_path.replace(image_path, '')}(未知错误: {e})") continue # 生成结果DataFrame barcodes_df = pd.DataFrame(list(barcodes.items()), columns=['filename', 'barcode']) # 释放资源 del reader
关键修改说明
- 错误捕获移至循环内部:每个文件的处理逻辑单独包裹在
try-except中,出错后通过continue跳过当前文件,继续处理下一个。 - 增加结果判空:提前判断
results是否为None,直接跳过无条码的文件,避免后续遍历触发类型错误。 - 多类型异常捕获:覆盖
BarcodeReaderError、TypeError及通用Exception,确保所有可能的错误都被捕获,不会中断循环。 - 清晰的日志输出:打印每个文件的处理状态或错误信息,方便后续排查问题。
内容的提问来源于stack exchange,提问作者hkay
相关产品推荐
相关产品推荐

