Siempre pensé que iterar sobre un archivo en Python sería equivalente a llamar a su método readline
en un bucle, pero hoy encontré una situación en la que eso no es cierto. Específicamente, tengo un proceso Popen
'd p
dondeDiferencia entre iterar sobre una línea de lectura de llamada y de archivo
list(itertools.takewhile(lambda x: x != "\n",
p.stdout))
cuelga (presumiblemente porque p
espera la entrada; tanto stdin
y stdout
son tuberías a mi proceso de Python), mientras que las siguientes obras:
list(itertools.takewhile(lambda x: x != "\n",
iter(p.stdout.readline, "")))
¿Alguien puede explicar la diferencia?
Nota al margen: en lugar de 'fiter()' puede usar 'iter (f.readline, None)', o incluso 'iter (f.readline," \ n ")' para reemplazar 'takewhile()'. –
El problema que está viendo está relacionado con el almacenamiento en búfer: 'file .__ iter __()' hace de alguna manera un almacenamiento en búfer más agresivo que 'file.readline()' - esa es también la razón por la que no puede mezclarlos. Demasiado perezoso para investigar los detalles y convertir esto en una respuesta en este momento ... –
@SvenMarnach: te refieres a 'iter (f.readline," ")', pero sí, gracias, me olvido de eso :) –