使用while循环

时间:2016-11-22 14:18:26

标签: python while-loop time-limiting

我有一些与在python中设置最长运行时间相关的问题。实际上,我想使用pdfminer将pdf文件转换为.txt。问题是,很多时候,某些文件无法解码并且需要很长时间。所以我想设置time.time()以将每个文件的转换时间限制为20秒。另外,我在windows下运行,所以我不能使用信号功能。

我成功地使用pdfminer.convert_pdf_to_txt()运行转换代码(在我的代码中它是“c”),但我无法在while循环中集成time.time()。在我看来,在以下代码中,while循环和time.time()不起作用。

总之,我想:

  1. 将pdf转换为txt

  2. 每次转换的时间限制为20秒,如果时间不够,则抛出异常并保存空文件

  3. 将所有txt文件保存在同一文件夹下

  4. 如果有任何异常/错误,仍然保存文件但内容为空。

  5. 以下是当前代码:

    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("")
    

1 个答案:

答案 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个空格缩进而不是太多空格;)