Запись и чтение постоянно в файле - PullRequest
0 голосов
/ 03 октября 2018

В настоящее время я пытаюсь найти способ, чтобы поток записывал логи в файл, а другой поток читал и обрабатывал их.Я нашел способ (часть 5) для непрерывного чтения данных в файле, но у меня проблема с записью файла в данные.

Когда я пытаюсь что-то записатьв файле мне нужно закрыть его позже, иначе файл останется пустым.Но если я закрою файл, я больше не смогу его прочитать.Таким образом, мой поток чтения выглядит так:

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

file = open(self.path)
loglines = follow(self.file)
for line in loglines:
    print(line)

Но для записи я использовал что-то вроде:

file = open(self.path, 'w')
file.write(self.generateLog())
file.close()
sleep(self.duration)

Но, как только вызывается file.close (), у меня естьошибка в части чтения:

  line 38, in run
    for line in loglines:
  line 147, in follow
    line = file.readline()
ValueError: I/O operation on closed file.

Но если я не закрываю файл после записи, он никогда не обновляется.(Я просто делаю часть записи, чтобы убедиться, что часть чтения работает. Теоретически файл журнала будет обновляться с помощью apache или чего-то еще.)

РЕДАКТИРОВАТЬ: Благодаря flush (), ябольше нет этой проблемы, спасибо большое!Но кажется, что писать и читать может быть трудно.Если я печатаю строку, которую я пишу, и ту, которую я читаю, я получаю что-то вроде:

Writing : 158.228.210.37 [...] "GET /cat/rzkpvwons HTTP/1.0" 505 1119
Reading : 5 1119

Таким образом, чтение не читает всю строку.Есть идеи о проблеме?

РЕДАКТИРОВАТЬ 2: Просто изменение open (путь, 'w') на открытие (путь, 'a +'), кажется, работает в сочетании с сбросом, следовало подумать об этом раньше.Большое спасибо!

Большое спасибо, Джаз

1 Ответ

0 голосов
/ 03 октября 2018

Эта библиотека делает все, что вам нужно?https://github.com/B2W-BIT/and Библиотека журналов асинхронного ввода-вывода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...