Ответы:
Прокрутите файл, чтобы прочитать строки:
with open('somefile') as openfileobject:
for line in openfileobject:
do_something()
Файловые объекты являются итерируемыми и выдают строки до EOF. При использовании файлового объекта в качестве итерируемого используется буфер для обеспечения выполнения операций чтения.
Вы можете сделать то же самое со стандартным вводом (не нужно использовать 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)начинает возвращать пустые байтовые строки.
stdinиз запущенного процесса ... поэтому у него никогда не будет EOF, пока я не убью процесс. Но потом я дохожу до «до настоящего момента» и захожу в тупик. Как мне обнаружить это, а не тупик? Например, если нет новых строк, прекратите читать файлы (даже если нет EOF, которого в моем случае никогда не будет).
Вы можете имитировать идиому 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)
readline()способа есть преимущество : вы можете выполнять мелкую обработку ошибок, например отлов UnicodeDecodeError, чего нельзя сделать с идиоматической forитерацией.
Идиома Python для открытия файла и чтения его построчно:
with open('filename') as f:
for line in f:
do_something(line)
Файл будет автоматически закрыт в конце приведенного выше кода ( withконструкция позаботится об этом).
Наконец, стоит отметить, что lineзавершающий символ новой строки будет сохранен. Это легко удалить с помощью:
line = line.rstrip()
for line in f.readlines(): ..., обычно предлагаемое решение.
Вы можете использовать приведенный ниже фрагмент кода для чтения построчно до конца файла.
line = obj.readline()
while(line != ''):
# Do Something
line = obj.readline()
Несмотря на то, что выше есть предложения «сделать это способом 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-ZLinux)
Вы можете использовать следующий фрагмент кода. readlines () читает сразу весь файл и разбивает его по строкам.
line = obj.readlines()
В дополнение к отличному ответу @dawg, эквивалентное решение с использованием оператора моржа (Python> = 3.8):
with open(filename, 'rb') as f:
while buf := f.read(max_size):
process(buf)
lineв конце будет символ новой строки.