Что такое идеальный аналог в 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()