fileinput — Iterar sobre líneas de múltiples flujos de entrada

Código fuente: Lib/fileinput.py


Este módulo implementa una clase auxiliar y funciones para escribir rápidamente un bucle sobre una entrada estándar o una lista de archivos. Si solo quiere leer o escribir un archivo, vea open().

El uso común es:

import fileinput
for line in fileinput.input():
    process(line)

Esto itera sobre las líneas de todos los archivos enumerados en sys.argv[1:], por defecto a sys.stdin``si la lista está vacía. Si un nombre de archivo es ``'-', también se reemplaza por sys.stdin y los argumentos opcionales mode y openhook se ignoran. Para especificar una lista alternativa de nombres de archivo, se pasa como primer argumento a input(). También se permite un único nombre de archivo.

Todos los archivos se abren en modo texto de manera predeterminada, pero puede anular esto especificando el parámetro mode en la llamada a input() o FileInput. Si se produce un error de E/S durante la apertura o lectura de un archivo, se lanza OSError.

Distinto en la versión 3.3: IOError solía ser lanzado; ahora es un alias de OSError.

Si sys.stdin se usa más de una vez, el segundo y siguientes usos no retornarán líneas, excepto tal vez para uso interactivo, o si se ha reiniciado explícitamente (por ejemplo, usando sys.stdin.seek(0)).

Los archivos vacíos se abren e inmediatamente se cierran; la única vez que su presencia en la lista de nombres de archivo es notable es cuando el último archivo abierto está vacío.

Las líneas se retornan con cualquier nueva línea intacta, lo que significa que la última línea en un archivo puede no tener una.

Puede controlar cómo se abren los archivos proporcionando un enlace de apertura a través del parámetro openhook a fileinput.input() o FileInput(). El enlace debe ser una función que tome dos argumentos, filename y mode, y retorna un objeto similar a un archivo abierto. Este módulo ya proporciona dos enlaces útiles.

La siguiente función es la interfaz principal de este módulo:

fileinput.input(files=None, inplace=False, backup='', *, mode='r', openhook=None)

Crea una instancia de la clase FileInput. La instancia se usará como estado global para las funciones de este módulo y también se volverá a usar durante la iteración. Los parámetros de esta función se pasarán al constructor de la clase FileInput.

La instancia FileInput se puede usar como gestor de contexto en la declaración with. En este ejemplo, input se cierra después de salir de la instrucción with, incluso si se produce una excepción:

with fileinput.input(files=('spam.txt', 'eggs.txt')) as f:
    for line in f:
        process(line)

Distinto en la versión 3.2: Se puede usar como gestor de contexto.

Distinto en la versión 3.8: Los parámetros de palabras clave mode y openhook ahora son solo palabras clave.

Las siguientes funciones utilizan el estado global creado por fileinput.input(); si no hay estado activo, es lanzado RuntimeError.

fileinput.filename()

Retorna el nombre del archivo que se está leyendo actualmente. Antes de leer la primera línea, retorna None.

fileinput.fileno()

Retorna el entero «file descriptor» para el archivo actual. Cuando no se abre ningún archivo (antes de la primera línea y entre archivos), retorna -1.

fileinput.lineno()

Retorna el número de línea acumulativa de la línea que se acaba de leer. Antes de que se haya leído la primera línea, retorna 0. Después de leer la última línea del último archivo, retorna el número de línea de esa línea.

fileinput.filelineno()

Retorna el número de línea en el archivo actual. Antes de que se haya leído la primera línea, retorna 0. Después de leer la última línea del último archivo, retorna el número de línea de esa línea dentro del archivo.

fileinput.isfirstline()

Retorna True si la línea que acaba de leer es la primera línea de su archivo; de lo contrario, retorna False.

fileinput.isstdin()

Retorna True si la última línea se leyó de sys.stdin, de lo contrario, retorna False.

fileinput.nextfile()

Cierra el archivo actual para que la próxima iteración lea la primera línea del siguiente archivo (si corresponde); las líneas no leídas del archivo no contarán para el recuento de líneas acumuladas. El nombre del archivo no se cambia hasta que se haya leído la primera línea del siguiente archivo. Antes de que se haya leído la primera línea, esta función no tiene efecto; no se puede usar para omitir el primer archivo. Después de leer la última línea del último archivo, esta función no tiene efecto.

fileinput.close()

Cierra la secuencia.

La clase que implementa el comportamiento de secuencia proporcionado por el módulo también está disponible para la subclasificación:

class fileinput.FileInput(files=None, inplace=False, backup='', *, mode='r', openhook=None)

La Clase FileInput es la implementación; sus métodos filename(), fileno(), lineno(), filelineno(), isfirstline(), isstdin(), nextfile() and close() corresponden a las funciones del mismo nombre en el módulo. Además tiene un método readline() que retorna la siguiente línea de entrada, y un método __getitem__() que implementa el comportamiento de secuencia. Se debe acceder a la secuencia en orden estrictamente secuencial; acceso aleatorio y readline() no se pueden mezclar.

Con mode puede especificar a qué modo de archivo se pasará open(). Debe ser uno de 'r', 'rU', 'U' and 'rb'.

El openhook, cuando se proporciona, debe ser una función que tome dos argumentos, filename y mode, y retorne un objeto similar a un archivo abierto en consecuencia. No puede usar inplace y openhook juntos.

Una instancia FileInput se puede usar como gestor de contexto en la instrucción with. En este ejemplo, input se cierra después de salir de la palabra clave:!with, incluso si se produce una excepción:

with FileInput(files=('spam.txt', 'eggs.txt')) as input:
    process(input)

Distinto en la versión 3.2: Se puede usar como gestor de contexto.

Obsoleto desde la versión 3.4: Los modos 'rU' and 'U'.

Obsoleto desde la versión 3.8: Soporte para el método __getitem__() está discontinuado.

Distinto en la versión 3.8: El parámetro de palabra clave mode y openhook ahora son solo palabras clave.

Filtrado al instante opcional: si el argumento de la palabra clave inplace=True se pasa a fileinput.input() o al constructor FileInput, el archivo se mueve a una copia de seguridad y la salida estándar es dirigida al archivo de entrada (si ya existe un archivo con el mismo nombre que el archivo de copia de seguridad, se reemplazará en silencio). Esto hace posible escribir un filtro que reescribe su archivo de entrada en su lugar. Si se proporciona el parámetro backup (generalmente como backup='.<some extension>'), este especifica la extensión para el archivo de respaldo y el archivo de respaldo permanece; de forma predeterminada, la extensión es '.bak' y se elimina cuando se cierra el archivo de salida. El filtrado en el lugar se desactiva cuando se lee la entrada estándar.

Este módulo proporciona los dos enlaces de apertura siguientes:

fileinput.hook_compressed(filename, mode)

Abre de forma transparente archivos comprimidos con gzip y bzip2 (reconocidos por las extensiones '.gz' and '.bz2') utilizando los módulos gzip y bz2. Si la extensión del nombre de archivo no es '.gz' or '.bz2', el archivo se abre normalmente (es decir, usando open() sin descompresión).

Ejemplo de uso: fi = fileinput.FileInput(openhook=fileinput.hook_compressed)

fileinput.hook_encoded(encoding, errors=None)

Retorna un enlace que abre cada archivo con open(), usando el encoding y errors dados para leer el archivo.

Ejemplo de uso: fi = fileinput.FileInput(openhook=fileinput.hook_encoded("utf-8", "surrogateescape"))

Distinto en la versión 3.6: Se agregó el parámetro opcional errors.