2009-04-30 3 views
21

줄 단위로 파일을 처리하는 많은 스크립트를 작성합니다. 펄, 나는Python은 Perl의 while (<>) {...}과 동일합니까?

while (<>) { 
    do stuff; 
} 

입력이 (파일 또는 표준 입력) 출처는 상관하지 않기 때문에이 편리를 사용합니다.

파이썬에서 나는 매우 우아하지 않는 것이

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 관용구가 있습니까?

import fileinput 

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

"읽을 수있는 코드"라는 관점에서 볼 때, Perl을 사용하지 않는 대부분의 사람들은 Perl 코드의 의미를 알지 못하기 때문에 Python 코드를 선호합니다. – 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 함수 모듈은 당신이 원하는 것입니다 리스트가 하늘의 경우

+0

참으로. 대단히 감사합니다. 죄송합니다. 같은 문제를 다루는 다른 질문을 놓쳤습니다. 이 tite로 찾기가 어려웠습니다 ... – 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 :'파일 이름의 대체 목록을 지정하려면 input()의 첫 번째 인수로 전달하십시오. 하나의 파일 이름도 허용됩니다. " – clacke

7

fileinput은 기본값이 표준이므로 기본값보다 약간 간결합니다.

많은 명령 줄을 사용하면이 piping hack은 매우 깔끔합니다.

+0

파이썬 레서피가 매우 깔끔합니다! 감사! – Bklyn