2011-10-17 63 views
7

Chúng tôi có vài tệp lớn (lớn hơn kích thước RAM) trong đĩa. Tôi muốn đọc chúng từng dòng trong python và kết quả đầu ra trong thiết bị đầu cuối. Tôi đã đi qua [1] và [2], nhưng tôi đang tìm kiếm các phương pháp mà không chờ đợi cho đến khi toàn bộ tập tin được đọc vào bộ nhớ.Cách đọc một tệp (hoặc stdin) theo dòng trong Python không chờ đọc toàn bộ tệp

tôi sẽ sử dụng cả hai lệnh:

cat fileName | python myScript1.py 
python myScript2.py fileName 

[1] How do you read from stdin in Python? [2] How do I write a unix filter in python?

Trả lời

8

Đây là standard behavior of file objects bằng Python:

with open("myfile.txt", "r") as myfile: 
    for line in myfile: 
     # do something with the current line 

hoặc

for line in sys.stdin: 
    # do something with the current line 
+0

Cảm ơn bạn đã trả lời nhanh. – BiGYaN

4

Chỉ cần lặp qua các file:

with open('huge.file') as hf: 
    for line in hf: 
    if 'important' in line: 
     print(line) 

Điều này đòi hỏi O (1) bộ nhớ.

Để đọc từ stdin, chỉ cần lặp qua sys.stdin thay vì hf:

import sys 
for line in sys.stdin: 
    if 'important' in line: 
    print(line) 
+0

Tôi là một newbie python, bạn có thể xin giải thích "chỉ đơn giản lặp trên sys.stdin thay vì hf". Bạn có nghĩa là 'cho dòng trong sys.stdin'? – BiGYaN

+1

Có, 'sys.stdin' chỉ là một [đối tượng tệp] (http://docs.python.org/library/sys.html?highlight=stdin#sys.stdin) hoạt động như một tệp bạn đã mở theo cách thủ công. –

0
if __name__ == '__main__': 
    while 1: 
     try: 
      a=raw_input() 
     except EOFError: 
      break 
     print a 

Điều này sẽ đọc từ stdin đến EOF. Để đọc một tập tin bằng cách sử dụng phương pháp thứ hai, bạn có thể sử dụng phương pháp của Tim

ví dụ:

with open("myfile.txt", "r") as myfile: 
    for line in myfile: 
     print line 
     # do something with the current line 
+0

Cảm ơn cả hai phương thức :) – BiGYaN

+2

Phương pháp này để đọc từ stdin cực kỳ cồng kềnh. 'sys.stdin' là một đối tượng giống như tệp và có thể được sử dụng thay thế. – phihag

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