вторник, 23 июля 2013 г.

Python и stdin

Почему питон читает стандартный ввод не так как остальные языки?

python -c 'import sys; [sys.stdout.write(line) for line in sys.stdin.xreadlines()];'

perl -e 'while(<>){print;}'
 

Как сделать так, чтобы программа реагировала по каждому переводу строки? ...и завершалась по первому нажатию <Ctrl-D>

$ python -c 'import sys;import time; b=time.time(); [sys.stdout.write("%f\t%s"%(time.time() - b,l)) for l in sys.stdin];'
1
2
3
4
5
3.411461    1
3.411516    2
3.411521    3
3.411524    4
3.411528    5


$ perl -M'Time::HiRes qw/time/' -e '$t0=time;while(<>){print time()-$t0,"\t",$_}'
1
0.394223928451538    1
2
0.731681108474731    2
3
1.00161504745483    3
4
1.306715965271    4
5
1.96435904502869    5
UPD. подсказали вариант с readline():
Интересно, можно ли написать короче ?
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

def xreadlines(stream):
  while 1:
    try:
      line = stream.readline()
    except KeyboardInterrupt:
      break

    if not line:
      break

    yield(line)


if __name__ == '__main__':
 
  for line in xreadlines(sys.stdin):
    sys.stdout.write(line)

Комментариев нет:

Отправить комментарий