Что такое идеальный аналог в Python для " пока не EOF"
6 ответов
цикл над файлом для чтения строк:
with open('somefile') as openfileobject:
for line in openfileobject:
do_something()
файловые объекты являются итерационными и дают строки до EOF. Использование объекта file в качестве iterable использует буфер для обеспечения выполнения чтения.
вы можете сделать то же самое с stdin (нет необходимости использовать raw_input()
:
import sys
for line in sys.stdin:
do_something()
чтобы завершить картину, двоичные чтения могут быть сделаны с:
from functools import partial
with open('somefile', 'rb') as openfileobject:
for chunk in iter(partial(openfileobject.read, 1024), ''):
do_something()
здесь chunk
будет содержать до 1024 байт за раз из файла.
вы можете имитировать идиому C в Python.
для чтения буфера до max_size
количество байт, вы можете сделать это:
with open(filename,'rb') as f:
while True:
buf=f.read(max_size)
if not buf: break
process(buf)
или текстовый файл строка за строкой:
# warning -- not idiomatic Python! See below...
with open(filename,'rb') as f:
while True:
line=f.readline()
if not line: break
process(line)
вам нужно использовать while True / break
построить так как там нет теста eof в Python, кроме отсутствия байтов, возвращаемых из чтения.
в C, вы могли бы иметь:
while ((ch != '\n') && (ch != EOF)){
// read the next ch and add to a buffer
// ..
}
однако вы не можете иметь это в Python:
while(line=f.readline()):
# syntax error
, потому что назначения не допускаются в выражениях в Python.
это точно больше идиоматический в Python, чтобы сделать это:
# THIS IS IDIOMATIC Python. Do this:
with open('somefile') as f:
for line in f:
process(line)
идиома Python для открытия файла и чтения его строка за строкой:
with open('filename') as f:
for line in f:
do_something(line)
файл будет автоматически закрыт в конце выше код (with
construct позаботится об этом).
наконец, стоит отметить, что line
сохранить пустую строку. Это можно легко удалить с помощью:
line = line.rstrip()
хотя есть предложения выше для "делать это способом python", если кто-то хочет действительно иметь логику, основанную на EOF, то я полагаю, что использование обработки исключений-это способ сделать это --
try:
line = raw_input()
... whatever needs to be done incase of no EOF ...
except EOFError:
... whatever needs to be done incase of EOF ...
пример:
$ 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
или Ctrl-Z на raw_input()
подсказка (Windows,Ctrl-Z Linux)
вы можете использовать ниже код, чтобы читать построчно до конца файла
line = obj.readline()
while(line != ''):
# Do Something
line = obj.readline()
вы можете использовать следующий фрагмент кода. readlines() считывает весь файл сразу и разбивает его на строки.
line = obj.readlines()