2009-04-30 29 views
21

Tôi viết rất nhiều tập lệnh nhỏ xử lý các tệp trên cơ sở từng dòng. Trong Perl, tôi sử dụngPython tương đương với Perl trong khi (<>) {...}?

while (<>) { 
    do stuff; 
} 

Điều này rất tiện lợi vì nó không quan tâm đến đầu vào (tệp hoặc stdin).

Trong Python tôi sử dụng này

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 

mà không có vẻ rất thanh lịch. Có một thành ngữ Python có thể dễ dàng xử lý đầu vào tập tin/stdin?

+1

Từ quan điểm "mã có thể đọc", tôi thích mã Python của bạn vì hầu hết mọi người không làm việc với Perl sẽ không biết mã Perl có nghĩa là gì. – schnaader

+4

Bạn có thể ít nhất bỏ qua. Readlines() – Jiri

+2

Nhân bản: http://stackoverflow.com/questions/715277/how-do-i-iterate-over-all-lines-of-files-passed-on-the-commandline -in-python –

Trả lời

49

Module fileinput trong thư viện chuẩn chỉ là những gì bạn muốn:

import fileinput 

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

Thật vậy. Cảm ơn rất nhiều. Rất tiếc, tôi đã bỏ lỡ câu hỏi khác đề cập đến cùng một vấn đề. Rất khó để tìm thấy với tite này ... – Eisen

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

này lặp trên các dòng của tất cả các file được liệt kê trong sys.argv [1:], mặc định cho sys.stdin nếu danh sách trống.

+0

Tôi đang sử dụng các đối số cho các mục đích khác, tôi có thể vô hiệu hóa hành vi đó không? – user1552512

+0

@ user1552512 Có, hãy xem https://docs.python.org/2/library/fileinput.html: 'Để chỉ định danh sách thay thế tên tệp, hãy chuyển nó làm đối số đầu tiên cho đầu vào(). Tên tệp duy nhất cũng được cho phép.' – clacke

7

fileinput mặc định là stdin, vì vậy sẽ làm cho nó ngắn gọn hơn một chút.

Nếu bạn thực hiện rất nhiều công cụ dòng lệnh, tuy nhiên, điều này piping hack rất gọn gàng.

+0

Công thức Python đó rất gọn gàng! Cảm ơn! – Bklyn

Các vấn đề liên quan