2016-01-22 10 views
3

Согласно David Beazley's talk on generators, следующий код должен повторить команду UNIX tail -f:Репликация «хвост -f» с Python

import time 
def follow(thefile): 
    thefile.seek(0,2) 
    while True: 
     line = thefile.readline() 
     if not line: 
      time.sleep(0.1) 
      continue 
     yield line 

f = open('followed.txt') 
lines = follow(f) 

for i in lines: 
    print i 

Если я запускаю это в раковине, он делает «что-то», и это действительно блокирует но и не распечатывает содержимое файла follow.txt. Почему так?

+0

** Уточнение **: с запущенным кодом я открываю файл follow.txt с Vim, добавляю строку произвольного текста и сохраняю его. Все еще ничего не печатается. – Pyderman

+1

Ваш метод работает для меня. –

+1

Как вы добавляете 'follow.txt'? Приведенный выше код может не работать, если вы добавляете текст в файл 'follow.txt' с помощью текстового редактора, поскольку текстовый редактор не может быть добавлен к исходному файлу - возможно, он создает новый файл и затем переименовывает' follow.txt 'to it ... – unutbu

ответ

4

Я пробовал сценарий, он работает.

Вы должны убедиться, что ваш входной файл растущий файл. Если нет, он висит и ожидает новых растущих линий.

Вот сценарий, продолжающий записывать строку с меткой времени в sample.csv каждые 5 секунд.

import os 
import time 
import datetime 

while True: 
    os.system("echo " + "sample line with timestamp:{0}".format(datetime.datetime.now()) + " >> " + " sample.csv") 
    time.sleep(5) 

tail -f Используйте свой сценарий, чтобы прочитать его, и вы увидите результат.

+0

Смотрите мой комментарий выше. – Pyderman

+1

@pyderman вы не можете добавить строку и сохранить файл. Он создаст новый файл с тем же именем – haifzhan

+0

Имеет смысл; Интересно, но как г-н Э выше смог добиться этого с помощью текстового редактора. – Pyderman

1

Генератор follow() будет возвращать только строки, которые записываются в файл после того, какfollow() был вызван. seek(0,2) помещает курсор в конец конец файла, а затем пытается прочитать новые строки с этой точки.

tail обычно выводит последние 10 строк по умолчанию. Если вы хотели чего-то подобного

def follow(thefile): 
    n_lines = 0 
    # Seek to the end of the file 
    thefile.seek(0,2) 
    # Seek the cursor back one character at a time until you 
    # reach the beginning of the file or 10 newlines are found. 
    while n_lines < 10 and thefile.tell() > 0: 
     # Go back one character and read it. 
     thefile.seek(-1, 1) 
     c = thefile.read(1) 
     # Only go back 10 lines 
     if c == '\n': 
      n_lines += 1: 
     # Reset the cursor position for the character we just read 
     thefile.seek(-1, 1) 

    while True: 
     line = thefile.readline() 
     if not line: 
      time.sleep(0.1) 
      continue 
     yield line 
+0

Красиво сделано. Это вратарь. – Pyderman

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

  • Нет связанных вопросов^_^