2015-08-08 3 views
2

Я пытаюсь читать каждую строку с помощью определенного интервала с использованием таймера питона из текстового файла Но это только для чтения первой строки и она непрерывно показываетчтение построчно с помощью таймера

моего код

def read(): 
    try: 
     while True: 
      fo = open("foo.txt", "r") 
      threading.Timer(1.0, read).start() 
      line=fo.readline() 
      print line 
      if len(line)==0: 
       break 
    except: 
     pass 
read() 
+0

Почему вы каждый раз открываете файл во время цикла? –

+0

Я попытался открыть перед циклом while, и он показывает ту же проблему –

+0

Что вы на самом деле пытаетесь сделать с этим? –

ответ

0

Проблема в том, что вы снова открываете файл, который начинает чтение из первой строки, и вы читаете эту строку, печатаете его и снова продолжаете цикл, что делает цикл бесконечным циклом.

Кроме того, что вы делаете с threading.Timer() не так, как вы его используете, threading.Timer() запускает функцию read в новом потоке через 1 сек, через некоторое время вы бы иметь нагрузок потоков все работает функция read() бесконечно.

То, что вы пытаетесь сделать, может быть легко выполнено (без использования threading.Timer()) с помощью time.sleep(), чтобы ваша программа сработала на определенное количество секунд. Пример -

def read(): 
    import time 
    with open("foo.txt", "r") as fo: 
     for line in fo: 
      print line 
      time.sleep(1) 
read() 

Если вы действительно хотите использовать threading.Timer(), то вам не нужен цикл while и вы должны передать объект файла в качестве аргумента функции, пример -

def read(fo): 
    line=fo.readline() 
    print line 
    if len(line) == 0: 
     return 
    t = threading.Timer(1.0, read, args=(fo,)) 
    t.start() 
    t.join() 

И затем вызовите функцию первоначально как -

with open("foo.txt", "r") as fo: 
    read(fo) 

Пример/Demo -

>>> def a(x): 
...  if x >50: 
...    return 
...  print(x) 
...  t = threading.Timer(1.0 , a, args=(x+1,)) 
...  t.start() 
...  t.join() 
... 
>>> import threading 
>>> a(1) 
1 
2 
3 
4 
5 
6 
7 
8 
+0

Да, он работает нормально, но он не является надежным для применения в робототехнике, например, перемещать руку с определенной скоростью и скоростью, поэтому я пытаюсь таймер. Тимер имеет конкретную и точную скорость –

+0

Ну, у меня есть текстовый файл, который содержащий записанные данные из последовательного порта. И теперь я пытаюсь воспроизвести данные. Я успешно выполнил запись и сохранил данные в txt-файле с помощью timer.Sleep me Это будет работать, но я делаю приложение для робототехники, поэтому мне нужно воспроизведение данных с определенной скоростью, поэтому я использую таймер –

+0

Я добавил решение, используя 'threading.Timer()'. –

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