Что такое идеальный аналог в 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 в качестве итерируемого использует буфер для обеспечения выполнения чтения.
вы можете сделать то же самое с 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 // .. }однако, вы не можете иметь это в Питон:
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строительство заботится об этом).наконец, стоит отметить, что
lineсохранить пустую строку. Это можно легко удалить с помощью:line = line.rstrip()
хотя есть предложения выше для "делать это на python way", если кто-то хочет действительно иметь логику, основанную на 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()
Comments