Что такое идеальный аналог в Python для "пока не EOF",
Чтобы прочитать некоторый текстовый файл в C или Pascal, я всегда использую следующие фрагменты для чтения данных до тех пор, пока EOF не будет:
while not eof do begin
readline(a);
do_something;
end;
Таким образом, мне интересно, как я могу сделать это просто и быстро в Python?
Ответы
Ответ 1
Прокрутите файл, чтобы прочитать строки:
with open('somefile') as openfileobject:
for line in openfileobject:
do_something()
Файловые объекты являются итеративными и дают строки до EOF. Используя объект файла в качестве итерируемого, используется буфер для обеспечения чтения чтения.
Вы можете сделать то же самое с 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), b''):
do_something()
где chunk
будет одновременно содержать до 1024 байтов из файла, и итерация останавливается, когда openfileobject.read(1024)
начинает возвращать пустые строки байтов.
Ответ 2
Вы можете подражать языку 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
, поскольку в Python нет теста eof, кроме отсутствия байтов, возвращаемых из чтения.
В C вы можете иметь:
while ((ch != '\n') && (ch != EOF)) {
// read the next ch and add to a buffer
// ..
}
Однако в Python этого не может быть:
while (line = f.readline()):
# syntax error
потому что назначения не допускаются в выражениях в Python (хотя последние версии Python могут имитировать это с помощью выражений присваивания, см. ниже).
Это, безусловно, более идиоматично в Python:
# THIS IS IDIOMATIC Python. Do this:
with open('somefile') as f:
for line in f:
process(line)
Обновление: Начиная с Python 3.8 вы также можете использовать выражения присваивания:
while line := f.readline():
process(line)
Ответ 3
Идиома Python для открытия файла и чтения строки за строкой:
with open('filename') as f:
for line in f:
do_something(line)
Файл будет автоматически закрыт в конце вышеуказанного кода (конструкция with
позаботится об этом).
Наконец, стоит отметить, что line
сохранит конечную новую строку. Это можно легко удалить, используя:
line = line.rstrip()
Ответ 4
Хотя есть предложения, приведенные выше для того, чтобы "сделать это способом 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)
Ответ 5
Вы можете использовать ниже фрагмент кода для чтения по строкам, до конца файла
line = obj.readline()
while(line != ''):
# Do Something
line = obj.readline()
Ответ 6
Вы можете использовать следующий фрагмент кода. readlines() читает во всем файле сразу и разбивает его по строке.
line = obj.readlines()