Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 16, 2010 18:48:48

zayac
От:
Зарегистрирован: 2010-08-16
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Чтение чисел из stdin до EOF

Добрый день!
Нужно читать и обрабатывать числа из стандартного потока до тех пор, пока не встретиться EOF. Аналогичный код на C++ выглядит так:

int num;
while (cin>>num)
do_something(num)
Как такое сделать на Python?
Спасибо



Офлайн

#2 Авг. 16, 2010 19:08:26

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Чтение чисел из stdin до EOF

Для чтения используем метод raw_input() и файловый объект sys.stdin.
Что такое EOF я не понял. Так же и что такое числа.

..bw



Офлайн

#3 Авг. 16, 2010 19:21:06

zayac
От:
Зарегистрирован: 2010-08-16
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Чтение чисел из stdin до EOF

Про raw_input и sys.stdin я знаю. Мне не нужно считывать всю строку целиком. Мне нужно считать символ до первого разделительного символа(пробел, табуляция, конец строки), обработать, затем считать следующий.
EOF - символ конца файла. В консоли вызывается как CTRL+Z



Офлайн

#4 Авг. 16, 2010 23:20:51

guranvir
От:
Зарегистрирован: 2010-03-16
Сообщения: 186
Репутация: +  0  -
Профиль   Отправить e-mail  

Чтение чисел из stdin до EOF

Ну а почему не считать всю строку, а ее уже посимвольно разбирать?



Офлайн

#5 Авг. 17, 2010 00:22:31

zayac
От:
Зарегистрирован: 2010-08-16
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Чтение чисел из stdin до EOF

Количество чисел может достигать 2^30. Хранить все ни к чему. Это задачка с ACM.
В С/С++ так можно сделать. Почему тут нельзя? Я даже код аналогичный привел.



Офлайн

#6 Авг. 17, 2010 11:16:37

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Чтение чисел из stdin до EOF

Ничего не понимаю: sys.stdin.read(1)

> В консоли вызывается как CTRL+Z
В этом случае ловите исключение KeyboardInterrupt. Но если источник не “клавиатура”, а /dev/random, тогда я не понимаю как интерпретировать EOF/CTRL+Z.

$ python -c“import sys; print repr(sys.stdin.read(1))”
ы
'\xd1'
$ echo “qwerty” | python -c“import sys; print repr(sys.stdin.read(1))”
'q'
$ python -c“import sys; print repr(sys.stdin.read(1))”
^CTraceback (most recent call last):
File “<string>”, line 1, in <module>
KeyboardInterrupt

> Я даже код аналогичный привел.
Я так же знаю C++, как вы Python.

p.s.

>>> import sys
>>> type(sys.stdin)
<type 'file'>
>>> help(file)
Help on class file in module __builtin__:

class file(object)
| file(name[, mode[, buffering]]) -> file object
|
| Open a file. The mode can be 'r', 'w' or 'a' for reading (default),
...
| read(...)
| read([size]) -> read at most size bytes, returned as a string.
...
| readline(...)
| readline([size]) -> next line from the file, as a string.
...
..bw



Отредактировано (Авг. 17, 2010 11:19:21)

Офлайн

#7 Авг. 17, 2010 12:08:03

Alex2ndr
От:
Зарегистрирован: 2009-12-26
Сообщения: 204
Репутация: +  0  -
Профиль   Отправить e-mail  

Чтение чисел из stdin до EOF

Вообще задача весьма низкоуровневая и решать ее средствами питона довольно странно… Ну да ладно - в академических целях:
EOF это символ с кодом -1 (вообще от платформы зависит). Т е в C, где есть getchar это обычно делается примерно так же как и показали:

#define EOF -1 
...
main()
{
int c;

while ((c = getchar()) != EOF)
//do_something
...
}
Получаем по одному символу, сравниваем их с -1 (ну или проверяем на то, что они больше 0) и в случае нахождения прекращаем цикл.
Такой же функционал в питоне можно сделать с полпинка:
for i in s:
if ord(i)<0: break
#do_something
где s должен быть некий генератор, отдающий по одному символу за раз(аналог getchar()).

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



Отредактировано (Авг. 17, 2010 12:25:28)

Офлайн

#8 Авг. 17, 2010 13:38:22

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Чтение чисел из stdin до EOF

> ord(i)<0
Долго смеялся.

> не самая простая задача

def S():
while True:
yield sys.stdin.read(1)

s = iter(S())
..bw



Офлайн

#9 Авг. 17, 2010 13:49:44

Alex2ndr
От:
Зарегистрирован: 2009-12-26
Сообщения: 204
Репутация: +  0  -
Профиль   Отправить e-mail  

Чтение чисел из stdin до EOF

bw
> ord(i)<0
Долго смеялся.
Над чем, если не секрет?

bw
> не самая простая задача
Код:

def S():
while True:
yield sys.stdin.read(1)

s = iter(S())
И что ваш код делает? Опять же если не секрет :)



Офлайн

#10 Авг. 17, 2010 14:16:26

zayac
От:
Зарегистрирован: 2010-08-16
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Чтение чисел из stdin до EOF

Теперь понятнее. Спасибо



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version