Чтобы прочитать текстовый файл на C или Pascal, я всегда использую следующие фрагменты для чтения данных до EOF:
while not eof do begin
readline(a);
do_something;
end;
Поэтому мне интересно, как я могу сделать это просто и быстро на Python?
Прокрутите файл, чтобы прочитать строки:
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)
начинает возвращать пустые байтовые строки.
line
в конце будет символ новой строки.stdin
из запущенного процесса ... поэтому у него никогда не будет EOF, пока я не убью процесс. Но потом я дохожу до «до настоящего момента» и захожу в тупик. Как мне обнаружить это, а не тупик? Например, если нет новых строк, прекратите читать файлы (даже если нет EOF, которого в моем случае никогда не будет).Вы можете имитировать идиому C в Python.
Чтобы прочитать буфер до
max_size
количества байтов, вы можете сделать это:Или текстовый файл построчно:
Вам нужно использовать
while True / break
конструкцию, поскольку в Python нет теста eof, кроме отсутствия байтов, возвращаемых при чтении.В C у вас может быть:
Однако в Python этого не может быть:
потому что присваивания не разрешены в выражениях в Python (хотя последние версии Python могут имитировать это с помощью выражений присваивания, см. ниже).
В Python, безусловно, более идиоматично делать это:
Обновление: начиная с Python 3.8 вы также можете использовать выражения присваивания :
источник
readline()
способа есть преимущество : вы можете выполнять мелкую обработку ошибок, например отловUnicodeDecodeError
, чего нельзя сделать с идиоматическойfor
итерацией.Идиома Python для открытия файла и чтения его построчно:
Файл будет автоматически закрыт в конце приведенного выше кода (
with
конструкция позаботится об этом).Наконец, стоит отметить, что
line
завершающий символ новой строки будет сохранен. Это легко удалить с помощью:источник
for line in f.readlines(): ...
, обычно предлагаемое решение.Вы можете использовать приведенный ниже фрагмент кода для чтения построчно до конца файла.
источник
Несмотря на то, что выше есть предложения «сделать это способом Python», если кто-то действительно хочет иметь логику, основанную на EOF, то я полагаю, что использование обработки исключений - способ сделать это -
Пример:
Или нажмите Ctrl-Zв
raw_input()
командной строке (Windows, Ctrl-ZLinux)источник
Вы можете использовать следующий фрагмент кода. readlines () читает сразу весь файл и разбивает его по строкам.
источник
В дополнение к отличному ответу @dawg, эквивалентное решение с использованием оператора моржа (Python> = 3.8):
источник