Câu trả lời:
Lặp lại tệp để đọc các dòng:
with open('somefile') as openfileobject:
for line in openfileobject:
do_something()
Các đối tượng tệp có thể lặp lại và các dòng cho đến khi EOF. Việc sử dụng đối tượng tệp như một tệp có thể lặp lại sử dụng bộ đệm để đảm bảo các lần đọc hiệu suất.
Bạn có thể làm tương tự với stdin (không cần sử dụng raw_input()
:
import sys
for line in sys.stdin:
do_something()
Để hoàn thành bức tranh, có thể thực hiện đọc nhị phân với:
from functools import partial
with open('somefile', 'rb') as openfileobject:
for chunk in iter(partial(openfileobject.read, 1024), b''):
do_something()
nơi chunk
sẽ chứa tối đa 1024 byte tại một thời điểm từ tệp và quá trình lặp dừng khi openfileobject.read(1024)
bắt đầu trả về chuỗi byte trống.
stdin
quá trình đang chạy ... vì vậy nó không bao giờ có EOF cho đến khi tôi giết quá trình. Nhưng sau đó tôi đạt đến "cuối cùng cho đến nay" và tôi bế tắc. Làm cách nào để phát hiện ra điều này và không bị bế tắc? Giống như nếu không có dòng mới, hãy ngừng đọc tệp (ngay cả khi không có EOF, trong trường hợp của tôi sẽ không bao giờ tồn tại).
Bạn có thể bắt chước thành ngữ C trong Python.
Để đọc một bộ đệm lên đến max_size
số byte, bạn có thể làm như sau:
with open(filename, 'rb') as f:
while True:
buf = f.read(max_size)
if not buf:
break
process(buf)
Hoặc, một tệp văn bản từng dòng:
# warning -- not idiomatic Python! See below...
with open(filename, 'rb') as f:
while True:
line = f.readline()
if not line:
break
process(line)
Bạn cần sử dụng while True / break
cấu trúc vì không có kiểm tra eof nào trong Python ngoài việc thiếu byte trả về từ một lần đọc.
Trong C, bạn có thể có:
while ((ch != '\n') && (ch != EOF)) {
// read the next ch and add to a buffer
// ..
}
Tuy nhiên, bạn không thể có điều này trong Python:
while (line = f.readline()):
# syntax error
bởi vì phép gán không được phép trong biểu thức trong Python (mặc dù các phiên bản Python gần đây có thể bắt chước điều này bằng cách sử dụng các biểu thức gán, xem bên dưới).
Nó chắc chắn là thành ngữ hơn trong Python để làm điều này:
# THIS IS IDIOMATIC Python. Do this:
with open('somefile') as f:
for line in f:
process(line)
Cập nhật: Kể từ Python 3.8, bạn cũng có thể sử dụng các biểu thức gán :
while line := f.readline():
process(line)
readline()
: bạn có thể xử lý lỗi chi tiết, chẳng hạn như bắt UnicodeDecodeError
, điều mà bạn không thể làm với for
lặp thành ngữ .
Thành ngữ Python để mở tệp và đọc từng dòng là:
with open('filename') as f:
for line in f:
do_something(line)
Tệp sẽ tự động được đóng ở cuối đoạn mã trên ( with
cấu trúc sẽ xử lý việc đó).
Cuối cùng, điều đáng chú ý là line
sẽ bảo toàn dòng mới theo sau. Điều này có thể dễ dàng loại bỏ bằng cách sử dụng:
line = line.rstrip()
for line in f.readlines(): ...
giải pháp tương tự , một giải pháp thường được đề xuất.
Bạn có thể sử dụng đoạn mã bên dưới để đọc từng dòng cho đến cuối tệp
line = obj.readline()
while(line != ''):
# Do Something
line = obj.readline()
Mặc dù có các đề xuất ở trên về "làm theo cách python", nhưng nếu ai đó muốn thực sự có logic dựa trên EOF, thì tôi cho rằng sử dụng xử lý ngoại lệ là cách để làm điều đó -
try:
line = raw_input()
... whatever needs to be done incase of no EOF ...
except EOFError:
... whatever needs to be done incase of EOF ...
Thí dụ:
$ echo test | python -c "while True: print raw_input()"
test
Traceback (most recent call last):
File "<string>", line 1, in <module>
EOFError: EOF when reading a line
Hoặc nhấn Ctrl-Zvào raw_input()
lời nhắc (Windows, Ctrl-ZLinux)
Bạn có thể sử dụng đoạn mã sau. readlines () đọc toàn bộ tệp cùng một lúc và tách nó ra từng dòng.
line = obj.readlines()
line
chúc có một ký tự dòng mới ở cuối.