Какви са разликите между „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