Найти - Пользователи
Полная версия: Как сделать readline при чтении файла блокирующим.
Начало » Python для новичков » Как сделать readline при чтении файла блокирующим.
1
kt315e
Задача в чтении дописываемиго другой программой файла. Необходимо получать цельные строки, а не порезанные в лапшу. То есть хочется чтобы readline ждал прихода символа конца строки и только после этого возвращал результат.
Такой код
#!/usr/bin/python
import sys
import time
inpf = open('inp','r')
while True:
line = inpf.readline()
if len(line) != 0 :
print len(line), ':', line
time.sleep(4)
при чтении медленно посимвольно дописываемого файла c содержимым
'0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31\n'
даёт вывод
1 : 0
4 : 1 2
4 : 3 4
4 : 5 6
4 : 7 8
4 : 9 1
4 : 0 11
4 : 12
4 : 13 1
4 : 4 15
1 :

7 : 16 17 1
4 : 8 19
4 : 20
4 : 21 2
4 : 2 23
4 : 24
4 : 25 2
4 : 6 27
4 : 28
4 : 29 3
4 : 0 31
1 :
Здесь http://python.su/forum/viewtopic.php?id=7155 решалась для stdin обратная задача - как сделать readline неблокирующим. Но чтобы сделать блокирующим соответстующего ключика не нашёл. (Не тем местом смотрел ?)
Vader
А что мешает сделать, например, так:
#!/usr/bin/python
import sys
import time
inpf = open('inp','r')
while True:
line = inpf.readline()
if len(line) != 0 and line[-1]=="\n":
print len(line), ':', line
time.sleep(4)
knkd
Создавайте пишущей программой заблокированный lock файл, а после окончания записи - удаляйте. Правда на винде это может плохо закончится.
kt315e
knkd:
Если не трудно дайте пример или ссылку с примером реализации на питоне, весьма полезно. Хотя грызут меня сомненения что .flush() не обязательно работает блокирующе, то есть передаёт управление следующему оператору после фактического выполнения. А то мы можем мы можем разблокировать файл, а вывод ещё не вытолкнулся. В win32 c этим наблюдался вообще бардак. Хотим выталкиваем, хотим нет. Приходилось закрывать файл, а потом снова открывать, чтобы вытолкнуть вывод.

Vader:
Примерно так и сделаю. Только нужно добавить накопление строки пока не встретится символ /n
(До сих пор не знаю как его понимать - символ конца строки или начала новой.)
kt315e
Работающий код
#!/usr/bin/python
import time
inpf = open('inp','r')
line = ''
while True:
line0 = inpf.readline()
if len(line0) != 0 :
line = line + line0
if line0[-1] == '\n' :
print len(line), ':', line
line = ''
time.sleep(4)
Ferroman
kt315e
Закрыть файл забыли.
Такие вещи вообще лучше заворачивать в обработчик исключений с закрытием открытых ресурсов в блоке finally,
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB