Чтение из файла во время записи в Python? - PullRequest
0 голосов
/ 12 марта 2020

Я следовал предложенному решению здесь

Чтобы проверить его, я использовал две программы, writer.py и reader.py соответственно.

# writer.py
import time

with open('pipe.txt', 'w', encoding = 'utf-8') as f:
    i = 0
    while True:
        f.write('{}'.format(i))
        print('I wrote {}'.format(i))
        time.sleep(3)
        i += 1
# reader.py
import time, os

#Set the filename and open the file
filename = 'pipe.txt'
file = open(filename, 'r', encoding = 'utf-8')

#Find the size of the file and move to the end
st_results = os.stat(filename)
st_size = st_results[6]
file.seek(st_size)

while 1:
    where = file.tell()
    line = file.readline()
    if not line:
        time.sleep(1)
        file.seek(where)
    else:
        print(line)

Но когда я запускаю:

 > python writer.py
 > python reader.py

читатель напечатает строки после того, как писатель вышел (когда я завершу процесс)

Есть ли другой способ обойти читать содержимое во время их записи?

[РЕДАКТИРОВАТЬ]
Программа, которая фактически записывает в файл, является приложением .exe, и у меня нет доступа к исходному коду.

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

Здесь есть 2 разные проблемы:

  1. ОС и файловая система должны разрешать одновременный доступ к файлу. Если вы не получили ошибку, это так, но в некоторых системах ее можно было бы запретить

  2. Писатель должен flush свой вывод, чтобы он достиг диска, чтобы читатель мог найти Это. Если вы этого не сделаете, выходные данные останутся в буфере памяти до тех пор, пока эти буферы не будут заполнены, для чего может потребоваться несколько килобайт

Таким образом, средство записи должно стать:

# writer.py
import time

with open('pipe.txt', 'w', encoding = 'utf-8') as f:
    i = 0
    while True:
        f.write('{}'.format(i))
        f.flush()
        print('I wrote {}'.format(i))
        time.sleep(3)
        i += 1
0 голосов
/ 12 марта 2020

Вам нужно flush записывать / печатать в файлы, или они по умолчанию будут иметь блочную буферизацию (поэтому вам придется записать несколько килобайт, прежде чем буфер режима пользователя будет фактически отправлен в ОС для записи ).

Самое простое решение - это позвонить .flush для после write вызовов:

    f.write('{}'.format(i))
    f.flush()
...