我有一些代码可以打开并搜索一个充满pdfs的文件夹。我正在使用pdfminer进行pdf转换。但是,我的一些pdf不可读。我希望我的代码能够处理转换工作的那些pdf,并有效地跳过那些转换失败的pdf文件。
我正在尝试使用try / except功能,但它似乎不起作用。对于失败的pdf,异常有效。但是,对于转换有效的pdfs,执行try和exception块。
这是我的代码:
fileNum = 0
d = shelve.open('PyDocSearch.db')
for file in fileList:
fileNum += 1
z = []
try:
doc = convert_pdf(filePath + '/' + file)
print 'Success:',file
docWords = doc.split()
x = Counter(docWords)
y = x.most_common()
for i,j in enumerate(y):
if j[0] not in commonWords:
z.append(j)
d[file] = z
except:
doc = 'fail'
print 'Fail:',file
d[file] = doc
d.close()
当pdf转换工作时,为什么两个块都被执行?而且,我该如何防止这种情况发生?谢谢!
答案 0 :(得分:1)
您可以做的一件事是,只有在没有引发异常的情况下,您才可以使用else
的{{1}}子句来执行代码:
try ... except ...
仅当fileNum = 0
d = shelve.open('PyDocSearch.db')
for file in fileList:
fileNum += 1
z = []
try:
doc = convert_pdf(filePath + '/' + file)
except:
doc = 'fail'
print 'Fail:',file
d[file] = doc
else:
print 'Success:',file
docWords = doc.split()
x = Counter(docWords)
y = x.most_common()
for i,j in enumerate(y):
if j[0] not in commonWords:
z.append(j)
d[file] = z
d.close()
块中的代码完成而不引发异常时,才会执行else
块中的代码。如果在try
块中引发异常,则else
子句不处理它。
正如其他人所说,单独使用except
是不好的做法。你得到的例外情况很可能是试图告诉你有关你的程序出错的原因,但是通过使用'裸'except
,你会把手指放在耳朵里说'la la la can听到你的声音,Python试图帮助你。
通常,只处理您期望的异常是一种好习惯。如果您知道如果出现问题,您的PDF库会引发except
,那么最好写一下
SomePDFException
而不是
except SomePDFException as e:
但是,如果您不知道类型,则可以使用以下内容捕获大多数 1 例外:
except:
然后告诉您引发的异常类型和消息。
1 有一些例外情况不会从 except Exception as e:
print "Got exception of type %s:" % type(e)
print e
继承,即Exception
,SystemExit
和KeyboardInterrupt
(文档:{{ 3}},Python 2)。如果您正在获取其中一个,我会感到惊讶,我希望您使用的PDF库遵循Python指导,从GeneratorExit
而不是Exception
派生例外。