HOWTO · Python
Cómo leer la entrada de stdin en Python
El artículo introduce métodos para leer la entrada de stdin en Python
En esta página
La entrada estándar, llamada habitualmente stdin, es un flujo de texto que un proceso de Python puede leer. Un terminal puede proporcionarla de forma interactiva, o bien otro comando puede enviarla mediante una tubería o una redirección. Son distintas formas de proporcionar datos al mismo flujo; no es necesario abrir un archivo con nombre dentro del programa. La API adecuada depende de si el programa espera una respuesta, muchas líneas o nombres de archivo y un flujo.
Cómo funciona la entrada estándar en Python
Al leer de la entrada estándar, un programa consume datos hasta que tiene suficiente o alcanza el final del archivo (EOF). En un terminal, EOF se envía con la combinación de teclas de fin de entrada propia de la plataforma; en una tubería o un archivo redirigido, se produce cuando el proceso que proporciona los datos cierra el flujo o cuando termina el archivo. Si un proceso espera más datos, no necesariamente se ha bloqueado: puede estar esperando otra línea o EOF.
input() lee una línea y devuelve su contenido como una cadena, sin el carácter de fin de línea. sys.stdin expone el flujo en sí, por lo que el código puede iterar sobre sus líneas o llamar a métodos como read() para consumir el resto. fileinput.input() añade el manejo de nombres de archivo: procesa los nombres pasados en la línea de comandos y usa la entrada estándar si no se proporciona ninguno.
Leer una línea con input()
Usa input() cuando el programa solicite una respuesta, como un nombre o un valor. Puede mostrar un mensaje, espera una línea y devuelve una cadena. Convierte esa cadena explícitamente si la operación siguiente necesita un número; por ejemplo, int() convierte una entrada que representa un entero. Un mensaje resulta útil en un terminal interactivo, mientras que los scripts que reciben datos mediante una tubería suelen omitirlo para que no se mezcle con la salida legible por máquinas.
Ejecuta este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
import io
import sys
sys.stdin = io.StringIO("Ada\n3\n")
name = input()
count = int(input())
print(f"{name} has {count} items")
El flujo en memoria hace que este ejemplo sea autónomo; normalmente, un script real lee el sys.stdin que ya tiene el proceso. En un terminal, escribe primero un nombre y luego un número entero, pulsando Intro después de cada línea. El programa convierte solo la segunda respuesta; input() devuelve texto. Si la entrada llega mediante una tubería o una redirección, el flujo proporcionado debe contener ambas líneas.
Leer líneas con sys.stdin
Si la entrada puede contener un número desconocido de líneas, itera sobre sys.stdin. Normalmente, cada línea obtenida conserva su terminador. Llamar a rstrip("\n") elimina los caracteres de nueva línea del final y conserva los demás espacios en blanco. En cambio, strip() también elimina espacios y tabulaciones que podrían ser datos significativos.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
import sys
for line in sys.stdin:
value = line.rstrip("\n")
print(value.upper())
El bucle continúa hasta EOF, así que, cuando termines en un terminal, envía la combinación de teclas de fin de entrada. En una tubería, el cierre del comando anterior cierra el flujo. Para consumir toda la entrada restante como una sola cadena, usa sys.stdin.read(); este método espera hasta EOF y puede consumir mucha memoria si el flujo es grande, por lo que la iteración línea por línea suele ser más adecuada para entradas voluminosas.
Leer archivos o la entrada estándar con fileinput.input()
Usa fileinput.input() cuando el mismo script que procesa líneas deba aceptar uno o varios nombres de archivo como argumentos de la línea de comandos y también funcionar como filtro. Si se proporcionan nombres de archivo, los lee en orden; si no se proporciona ninguno, lee de la entrada estándar. Así, quien lo ejecuta puede elegir entre un archivo de entrada con nombre y una tubería sin cambiar el bucle de procesamiento.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
import fileinput
for line in fileinput.input():
print(line.rstrip("\n").upper())
Por ejemplo, el script puede ejecutarse con un nombre de archivo, o bien otro comando puede enviarle texto mediante una tubería sin proporcionar ningún nombre de archivo. El código mostrado no se ejecutó según el paquete suministrado; aquí no se afirma ninguna salida de ejemplo. Consulta la documentación de Python sobre fileinput para ver opciones como obtener el nombre del archivo actual y su número de línea.
Elegir el enfoque adecuado
Elige input() si necesitas mostrar un mensaje y leer una sola línea, especialmente cuando una persona interactúa con el programa. Elige sys.stdin si el programa procesa un flujo arbitrario, debe manejar muchas líneas o necesita consumir todo el flujo con read(). Elige fileinput.input() si el mismo programa orientado a líneas debe procesar nombres de archivo de la línea de comandos o recurrir a la entrada estándar.
Recuerda que input() devuelve texto, aunque la respuesta parezca numérica. Al procesar un flujo, decide si los espacios en blanco que rodean cada línea forman parte de los datos antes de eliminarlos. Si lees el flujo completo, ten en cuenta que el programa solo termina al alcanzar EOF. Estas diferencias ayudan a elegir una API adecuada para el origen y el tamaño de la entrada.