2009-04-30 3 views
21

Я пишу много маленьких скриптов, которые обрабатывают файлы по очереди. В Perl, я используюPython эквивалент Perl while (<>) {...}?

while (<>) { 
    do stuff; 
} 

Это удобно, потому что он не заботится, где вход поступает из (файла или стандартного ввода).

В Python Я использую этот

if len(sys.argv) == 2: # there's a command line argument 
    sys.stdin = file(sys.argv[1]) 
for line in sys.stdin.readlines(): 
    do stuff 

, который, кажется, не очень элегантно. Есть ли идиома Python, которая легко обрабатывает входной файл/stdin?

+1

С точки зрения «читаемого кода», я бы предпочел ваш код Python, так как большинство людей, не работающих с Perl, не будут знать, что означает код Perl. – schnaader

+4

Вы можете хотя бы опустить .readlines() – Jiri

+2

Дубликат: http://stackoverflow.com/questions/715277/how-do-i-iterate-over-all-lines-of-files-passed-on-the-commandline -in-python –

ответ

49

Модуль FileInput в стандартной библиотеке именно то, что вы хотите:

import fileinput 

for line in fileinput.input(): ... 
+0

Действительно. Бесконечно благодарен. Извините, я пропустил другой вопрос, который касается тех же проблем. С этим типом было трудно найти ... – Eisen

15
import fileinput 
for line in fileinput.input(): 
    process(line) 

Это перебирает строки всех файлов, перечисленных в sys.argv [1:], недобросовестный sys.stdin если список пуст.

+0

Я использую аргументы для других целей, могу ли я отключить это поведение? – user1552512

+0

@ user1552512 Да, см. Https://docs.python.org/2/library/fileinput.html: 'Чтобы указать альтернативный список имен файлов, передайте его как первый аргумент для ввода(). Также разрешено одно имя файла. ' – clacke

7

fileinput defaults to stdin, так что сделайте его немного более кратким.

Если вы делаете много сообщений в командной строке, то этот piping hack очень опрятный.

+0

Этот рецепт Python очень опрятен! Благодаря! – Bklyn

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