Я пытаюсь найти хороший способ прочитать файл журнала в реальном времени с помощью python. Я хотел бы обрабатывать строки из файла журнала по одному за раз, как написано. Мне почему-то нужно продолжать читать файл, пока он не будет создан, а затем продолжить обработку строк до тех пор, пока я не закончу процесс. Есть ли подходящий способ сделать это? Спасибо.
Чтение из файла журнала, поскольку оно написано с использованием python
Ответ 1
Вы можете попробовать что-то вроде этого:
import time
while 1:
where = file.tell()
line = file.readline()
if not line:
time.sleep(1)
file.seek(where)
else:
print line, # already has newline
Пример был извлечен из здесь.
Ответ 2
Посмотрите этот PDF, начиная со страницы 38, ~ слайд I-77, и вы найдете всю необходимую информацию. Конечно, остальные слайды тоже потрясающие, но они специально касаются вашей проблемы:
import time
def follow(thefile):
thefile.seek(0,2) # Go to the end of the file
while True:
line = thefile.readline()
if not line:
time.sleep(0.1) # Sleep briefly
continue
yield line
Ответ 3
Поскольку это Python и тегированные теги, есть еще одна возможность сделать это.
Я предполагаю, что это основано на протоколе Python logging.Handler.
Вы можете просто создать класс, который получает экземпляр (названный) регистратора и перезаписывает функцию emit
, чтобы поместить его в графический интерфейс (если вам нужна консоль, просто добавьте обработчик консоли в обработчик файла)
Пример:
import logging
class log_viewer(logging.Handler):
""" Class to redistribute python logging data """
# have a class member to store the existing logger
logger_instance = logging.getLogger("SomeNameOfYourExistingLogger")
def __init__(self, *args, **kwargs):
# Initialize the Handler
logging.Handler.__init__(self, *args)
# optional take format
# setFormatter function is derived from logging.Handler
for key, value in kwargs.items():
if "{}".format(key) == "format":
self.setFormatter(value)
# make the logger send data to this class
self.logger_instance.addHandler(self)
def emit(self, record):
""" Overload of logging.Handler method """
record = self.format(record)
# ---------------------------------------
# Now you can send it to a GUI or similar
# "Do work" starts here.
# ---------------------------------------
# just as an example what e.g. a console
# handler would do:
print(record)
В настоящее время я использую аналогичный код для добавления TkinterTreectrl.Multilistbox для просмотра вывода журнала во время выполнения.
Off-Side: регистратор получает данные только после их инициализации, поэтому, если вы хотите, чтобы все ваши данные были доступны, вам необходимо инициализировать его в самом начале. (Я знаю, что это то, что ожидается, но я думаю, что стоит упомянуть.)
Ответ 4
Возможно, вы могли бы сделать системный вызов
tail -f
с помощью os.system()