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
.
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 claseFileInput
.La instancia
FileInput
se puede usar como gestor de contexto en la declaraciónwith
. En este ejemplo, input se cierra después de salir de la instrucciónwith
, 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, retornaFalse
.
-
fileinput.
isstdin
()¶ Retorna
True
si la última línea se leyó desys.stdin
, de lo contrario, retornaFalse
.
-
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étodosfilename()
,fileno()
,lineno()
,filelineno()
,isfirstline()
,isstdin()
,nextfile()
andclose()
corresponden a las funciones del mismo nombre en el módulo. Además tiene un métodoreadline()
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 yreadline()
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ónwith
. 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ódulosgzip
ybz2
. Si la extensión del nombre de archivo no es'.gz'
or'.bz2'
, el archivo se abre normalmente (es decir, usandoopen()
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.