2016-11-22 1 views
0

У меня есть некоторые вопросы, связанные с установкой максимального времени работы в python. На самом деле, я хотел бы использовать pdfminer для преобразования файлов PDF в .txt. Проблема в том, что очень часто некоторые файлы невозможно декодировать и занимать очень много времени. Поэтому я хочу установить time.time(), чтобы ограничить время преобразования для каждого файла до 20 секунд. Кроме того, я запускаю под окнами, поэтому я не могу использовать функцию сигнала.ограничение настройки питона для времени работы с циклом while

Мне удалось запустить код преобразования с pdfminer.convert_pdf_to_txt() (в моем коде это «c»), но я не смог интегрировать time.time() в цикл while. Мне кажется, что в следующем коде цикл while и time.time() не работают.

В заключение, я хочу:

  1. конвертировать PDF в TXT

  2. ограничение по времени для каждого преобразования в 20 сек, если он работает вне времени, бросить excepetion и сохранить пустой файл

  3. сохранить все файлы тхт под одной и той же папке

  4. , если есть какие-либо исключения/ошибки, по-прежнему сохранить файл, но с пустым контентом.

Вот текущий код:

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

полезная ссылка. http://stackoverflow.com/questions/13293269/how-would-i-stop-a-while-loop-after-n-amount-of-time – Stormvirux

+0

@Stormvirux Да, я прочитал это сообщение, прежде чем завершить вышеуказанный код .. Я все еще не мог понять, как интегрироваться в мой код: ( – SXC88

+0

@ SXC88 - Я только что закончил свой ответ, надеюсь, что это поможет! – linusg

ответ

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 пространства вмятие и не слишком много пустого пространства;)

+0

Привет, благодарю вас за ваш комментарий! Но проблема в том, что я использую модуль pdfminer, который можно использовать только в python 2.X, поэтому я не думаю, что функция сигнала доступна здесь (она всегда выдает ошибку на самом деле). Кроме того, с вашим кодом появляется сообщение об ошибке и указывает, что есть синтаксическая ошибка с «except KeyboardInterrupt» ... Я так запутан ... ... (( – SXC88

+0

@ SXC88 - Извините, у меня был неправильный отступ. исправлено. Модуль '' signal'' доступен также под Python 2: https://docs.python.org/2/library/signal.html. Повторите попытку, скажите, исчезла ли синтаксическая ошибка, какая ошибка вы получаете о сигнальном модуле. – linusg

+0

Чем вы, но всегда меня бросает мне это сообщение «строка 14, в signal.signal (signal.SIGALRM, timeout_handler) AttributeError: объект 'module' не имеет атрибута 'SIGALRM'. .. – SXC88

Смежные вопросы