2013-06-18 5 views
2

Я пытаюсь просто читать из стандартного ввода, используя кодеки, используя код нижезадержки чтения с кодеками стандартного ввода

import codecs 

ins = codecs.getreader('utf-8')(sys.stdin, 'replace') 
for l in ins: 
    print l 

У меня есть еще один сценарий, который записывает на стандартный вывод в порыве небольших данных. Мне нужен мой скрипт для обработки данных после каждого всплеска. Тем не менее, кодеки, похоже, заполняют данные. Это означает, что строки, записанные в stdout, не отображаются сразу в моем коде выше. Есть ли параметр, который я могу настроить для предотвращения буферизации?

Спасибо!

ответ

1

В этом, казалось бы, простом примере есть два уровня буферизации. Чтобы избежать первого уровня --- и более как обходное решение, чем решение --- вы можете читать каждую строку, а затем декодировать ее, а не наоборот. Он работает, потому что окончание строки все равно однозначно \ n в utf-8. (Примечание: это первая часть кода не работает, потому что он все еще имеет 2-й уровень буферизации Он входит в иллюстративных целях)

for l in sys.stdin: 
    l = l.decode('utf-8', 'replace') 
    print l 

Второй уровень происходит от for l in file. Поэтому вам действительно нужно:

while True: 
    l = sys.stdin.readline() 
    if not l: break 
    l = l.decode('utf-8', 'replace') 
    print l 
+0

Спасибо за помощь! Второй пример сработал. Я только добавил 'strip()' для чтения ввода, чтобы удалить лишнюю пустую строку, которая была введена. В качестве альтернативы я мог бы использовать 'sys.stdout.write()' вместо 'print()'. Я не получил первый пример для работы кстати. Я не вникал в это, так как моя проблема решена. – chris

+1

Добавил ** комментарий ** к моему ответу. –

+0

По какой-то причине я не могу найти документацию о буферизации, которая происходит в 'for l in sys.stdin'. У вас есть ссылка на это? – chris

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