Ответы:
Прокрутите файл, чтобы прочитать строки:
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
в конце будет символ новой строки.