В чем разница между `next(f)`, `f.readline()` и `f.next()` в Python?

Обрабатываю один файл: пропускаю заголовок (комментарий), обрабатываю первую строку, обрабатываю остальные строки.

f = open(filename, 'r')

# skip the header
next(f)  

# handle the first line
line =  next(f)  
process_first_line(line)

# handle other lines
for line in f:
    process_line(line)

Если line = next(f) заменить на line = f.readline(), возникнет ошибка.

ValueError: смешивание методов итерации и чтения приведет к потере данных

Поэтому я хотел бы знать различия между next(f), f.readline() и f.next() в Python?


person SparkAndShine    schedule 25.11.2015    source источник
comment
Функция next(iter) вызывает iter.next() и будет обрабатывать исключение StopIteration, если вы укажете next() второй аргумент. Подробности о next() и file.readline() см. в дубляже.   -  person Martijn Pieters    schedule 25.11.2015
comment
Дубликат охватывает ту же идею, которая является несоответствием, возникающим из-за использования как readline, так и next. Тем не менее, в этом посте конкретно спрашивается, в чем разница между ними, что отличается от того, что спрашивает дубликат. Кто-то другой, задающий тот же вопрос, скорее всего, найдет этот пост вместо дубликата. Кроме того, принятый ответ на самом деле не отвечает на вопрос, поскольку не объясняет, что делает readline.   -  person orodbhen    schedule 30.01.2018


Ответы (1)


Цитируя официальную документацию Python,

Объект file является собственным итератором, например iter(f) возвращает f (если f не закрыт). Когда файл используется в качестве итератора, обычно в цикле for (например, for line in f: print line.strip()), метод next() вызывается повторно. Этот метод возвращает следующую строку ввода или поднимает StopIteration при нажатии EOF, когда файл открыт для чтения (поведение не определено, когда файл открыт для записи). Чтобы сделать цикл for наиболее эффективным способом обхода строк файла (очень распространенная операция), метод next() использует скрытый буфер упреждающего чтения. Вследствие использования буфера упреждающего чтения объединение next() с другими файловыми методами (например, readline()) работает неправильно.

По сути, когда функция next вызывается для файлового объекта Python, она извлекает определенное количество байтов из файла, обрабатывает их и возвращает только текущую строку (конец текущей строки определяется символом новой строки). Итак, указатель файла перемещается. Он не будет находиться в той же позиции, где заканчивается текущая возвращаемая строка. Таким образом, вызов readline даст противоречивый результат. Именно поэтому смешивание их обоих не допускается.

person thefourtheye    schedule 25.11.2015
comment
Хотя он устраняет ошибку, с которой столкнулся OP, на самом деле это не отвечает на вопрос, как указано. Это только объясняет, как работает next(), а не другие функции. - person orodbhen; 30.01.2018