Что такое идеальный аналог в Python для " пока не EOF"

чтобы прочитать текстовый файл на C или Pascal, я всегда использую следующие фрагменты для чтения данных до EOF:

while not eof do begin
  readline(a);
  do_something;
end;

таким образом, мне интересно, как я могу сделать это просто и быстро в Python?

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()