Imagewand运行PDF转OCR重命名脚本时while循环二次运行抛BlobError
问题原因
- 你在脚本初始化阶段就一次性读取了当前目录的所有PDF文件存入全局变量
allpdf,这个列表不会随着后续文件被重命名、移动操作自动更新。第二次循环执行TwoLine()函数时,遍历的还是最初的文件列表,列表中大部分文件已经被移动到其他目录或者被重命名,按原路径访问自然会抛出文件不存在的异常。 - 额外问题:循环判断条件
bool(allpdf)==True永远为真,你从未更新过allpdf的内容,哪怕当前目录已经没有待处理的PDF,列表还是保留初始化时的内容,会导致无效循环一直执行到scaledef低于2500才停止。
解决方法
- 取消全局的
allpdf变量,将PDF文件列表的读取逻辑放到while循环内部,每次循环都重新扫描当前目录的PDF文件,确保拿到的是当前真实存在的待处理文件。 - 给
TwoLine()、PNFilter()函数新增参数接收最新的PDF列表,不要依赖全局变量传值。 - 在操作文件前增加存在性校验,避免偶发的文件丢失导致程序崩溃。
代码修改示例
首先修改循环逻辑:
# 删掉原来的全局allpdf = find_ext(".","pdf") 这行代码 # 确保scaledef初始值 >= 2600,第一次减100后仍满足循环条件 scaledef = 3000 while scaledef >= 2500: # 每次循环重新读取当前目录下的PDF allpdf = find_ext(".","pdf") # 没有待处理文件直接退出循环 if not allpdf: break scaledef -= 100 # 把最新的文件列表传入函数 TwoLine(allpdf) PNFilter(allpdf)
然后修改TwoLine()函数开头,增加文件存在性校验:
def TwoLine(allpdf): for PDF_file in allpdf: # 操作前先判断文件是否存在,不存在直接跳过 if not os.path.exists(PDF_file): continue # 后续保留你原来的业务逻辑不变 PDFfile = wi(filename=PDF_file[2:],resolution=200) # ...其余原有代码
PNFilter()函数也对应改成接收allpdf参数,操作文件前也可以加同样的存在性校验。
内容的提问来源于stack exchange,提问作者Khairil Amirul
相关产品推荐
相关产品推荐

