2014-02-13 2 views
1

Я хочу передать несколько файлов в скрипт python, но я не знаю, как это сделать.Python, читающий несколько файлов через stdin

import sys 

file1 = sys.stdin.read() 
file2 = sys.stdin.read() 

print 
print "You entered: " + file1 
print 
print 
print "You entered: " + file2 

Выполнение сценария с вводом типизации он работает отлично, например:

python input.py 
FIRST 
SECOND 

You entered: FIRST 

You entered: SECOND 

Если I трубы файл в сценарии он будет извлекать только один из входов:

cat file1.txt file2.txt | python input.py 

You entered: This is file 1 
This is file 2 

You entered: 

Мое первое предположение заключается в том, что это имеет какое-то отношение к EOF?

+1

'cat' con'cat: несколько файлов в * один * файл и сбрасывает их в STDOUT (по умолчанию) -' read' загружает данные, пока их больше не читать (т.е. до 'EOF'). чтобы каждый файл отличался? –

+1

В manpage '' '' '' '' 'кот': * cat - конкатенировать и печатать файлы *. Конкатенатная часть здесь - это то, что вас подводит; 'stdin' является * one * fileobject, и никакие' EOF 's отправляются, когда-либо. –

+1

Вы не можете делать то, что хотите сделать с трубой, если не вставить специальный маркер самостоятельно. Вместо этого используйте имена файлов в командной строке. –

ответ

0

Сам вызов read не является буферизированным. Он читает максимум X KB (я думаю, что X - это что-то около 4K на большинстве систем, но точное число здесь не должно быть важно), или пока ничего не осталось прочитать.

Когда вы подключаете файл, вы представляете полный ввод сразу. Итак, первый read взламывает первый X КБ.

Когда вы печатаете на терминале, первый read slurps до тех пор, пока нет ничего, что можно было бы прочитать; вы еще не набрали его. Второе чтение ожидает пока что-то прочитать (когда вы нажмете enter), то читает X больше КБ.

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