我有一些与在python中设置最长运行时间相关的问题。实际上,我想使用pdfminer将pdf文件转换为.txt。问题是,很多时候,某些文件无法解码并且需要很长时间。所以我想设置time.time()
以将每个文件的转换时间限制为20秒。另外,我在windows下运行,所以我不能使用信号功能。
我成功地使用pdfminer.convert_pdf_to_txt()
运行转换代码(在我的代码中它是“c”),但我无法在while循环中集成time.time()
。在我看来,在以下代码中,while循环和time.time()
不起作用。
总之,我想:
将pdf转换为txt
每次转换的时间限制为20秒,如果时间不够,则抛出异常并保存空文件
将所有txt文件保存在同一文件夹下
如果有任何异常/错误,仍然保存文件但内容为空。
以下是当前代码:
import converter as c
import os
import timeit
import time
yourpath = 'D:/hh/'
for root, dirs, files in os.walk(yourpath, topdown=False):
for name in files:
t_end = time.time() +20
try:
while time.time() < t_end:
c.convert_pdf_to_txt(os.path.join(root, name))
t=os.path.split(os.path.dirname(os.path.join(root, name)))[1]
a=str(os.path.split(os.path.dirname(os.path.join(root, name)))[0])
g=str(a.split("\\")[1])
with open("D:/f/"+g+"&"+t+"&"+name+".txt", mode="w") as newfile:
newfile.write(c.convert_pdf_to_txt(os.path.join(root, name)))
print "yes"
if time.time() > t_end:
print "no"
with open("D:/f/"+g+"&"+t+"&"+name+".txt", mode="w") as newfile:
newfile.write("")
except KeyboardInterrupt:
raise
except:
for name in files:
t=os.path.split(os.path.dirname(os.path.join(root, name)))[1]
a=str(os.path.split(os.path.dirname(os.path.join(root, name)))[0])
g=str(a.split("\\")[1])
with open("D:/f/"+g+"&"+t+"&"+name+".txt", mode="w") as newfile:
newfile.write("")
答案 0 :(得分:1)
你的方法错了。
如果当前时间戳低于结束时间戳(将始终为while
),您要做的是定义结束时间,立即进入True
循环。
因此输入了while
循环,你就会陷入转换函数。
我会建议signal
模块,它已包含在Python中。它允许您在n
秒后退出一个函数。在this StackOverflow anser中可以看到一个基本示例。
您的代码将是这样的:
return astring
import converter as c
import os
import timeit
import time
import threading
import thread
yourpath = 'D:/hh/'
for root, dirs, files in os.walk(yourpath, topdown=False):
for name in files:
try:
timer = threading.Timer(5.0, thread.interrupt_main)
try:
c.convert_pdf_to_txt(os.path.join(root, name))
except KeyboardInterrupt:
print("no")
with open("D:/f/"+g+"&"+t+"&"+name+".txt", mode="w") as newfile:
newfile.write("")
else:
timer.cancel()
t=os.path.split(os.path.dirname(os.path.join(root, name)))[1]
a=str(os.path.split(os.path.dirname(os.path.join(root, name)))[0])
g=str(a.split("\\")[1])
print("yes")
with open("D:/f/"+g+"&"+t+"&"+name+".txt", mode="w") as newfile:
newfile.write(c.convert_pdf_to_txt(os.path.join(root, name)))
except KeyboardInterrupt:
raise
except:
for name in files:
t=os.path.split(os.path.dirname(os.path.join(root, name)))[1]
a=str(os.path.split(os.path.dirname(os.path.join(root, name)))[0])
g=str(a.split("\\")[1])
with open("D:/f/"+g+"&"+t+"&"+name+".txt", mode="w") as newfile:
newfile.write("")
我真的希望这会有所帮助。如果您在理解代码更改时遇到问题,请随时提问。
仅限于未来:4个空格缩进而不是太多空格;)