HOWTO · Python
Como ler as entradas da stdin em Python
O artigo introduz métodos para ler a entrada da stdin em Python
Nesta página
A entrada padrão, geralmente chamada stdin, é um fluxo de texto que um processo Python pode ler. Um terminal pode fornecê-la de forma interativa, ou outro comando pode enviar dados por meio de um pipe ou redirecionamento. Essas são maneiras diferentes de fornecer dados ao mesmo fluxo; não é necessário abrir um arquivo com nome no programa. A API adequada depende de o programa esperar uma resposta, várias linhas ou nomes de arquivos e um fluxo.
Como a entrada padrão funciona em Python
Quando um programa lê da entrada padrão, consome dados até ter o suficiente ou chegar ao fim do arquivo (EOF). Em um terminal, o EOF é enviado pela combinação de teclas de fim de entrada da plataforma; em um pipe ou arquivo redirecionado, ocorre quando o produtor fecha o fluxo ou o arquivo termina. Um processo que aguarda mais entrada não necessariamente travou: pode estar esperando outra linha ou o EOF.
input() lê uma linha e retorna seu conteúdo como uma string, sem o caractere de fim de linha. sys.stdin expõe o próprio fluxo, permitindo iterar pelas linhas ou chamar métodos como read() para consumir o restante. fileinput.input() acrescenta o tratamento de nomes de arquivos: processa os nomes passados na linha de comando e usa a entrada padrão quando nenhum nome é fornecido.
Ler uma linha com input()
Use input() quando o programa pedir uma resposta, como um nome ou um valor. A função pode exibir uma solicitação, aguarda uma linha e retorna uma string. Converta essa string explicitamente quando a próxima operação precisar de um número; por exemplo, int() converte uma entrada que representa um número inteiro. Uma solicitação é útil em um terminal interativo, enquanto scripts que recebem entrada por pipe muitas vezes a omitem para que ela não se misture à saída legível por máquina.
Execute este exemplo. O código e o texto que ele exibe permanecem em inglês:
import io
import sys
sys.stdin = io.StringIO("Ada\n3\n")
name = input()
count = int(input())
print(f"{name} has {count} items")
O fluxo em memória torna este exemplo autocontido; um script real normalmente lê o sys.stdin que já está disponível para o processo. Em um terminal, digite um nome e depois um número inteiro, pressionando Enter após cada linha. O programa converte apenas a segunda resposta; input() retorna texto. Se a entrada vier de um pipe ou redirecionamento, o fluxo fornecido precisa conter as duas linhas.
Ler linhas com sys.stdin
Para uma entrada com um número desconhecido de linhas, itere sobre sys.stdin. Cada linha produzida normalmente mantém seu terminador de linha. Chamar rstrip("\n") remove os caracteres de nova linha do final e preserva os demais espaços em branco, ao contrário de strip(), que também remove espaços e tabulações que podem ser dados significativos.
O código permanece em inglês:
import sys
for line in sys.stdin:
value = line.rstrip("\n")
print(value.upper())
O loop continua até o EOF; portanto, quando terminar, envie a combinação de teclas de fim de entrada no terminal. Em um pipe, o encerramento do comando anterior fecha o fluxo. Para consumir toda a entrada restante como uma única string, use sys.stdin.read(); isso aguarda o EOF e pode usar bastante memória em um fluxo grande, então iterar pelas linhas costuma ser mais adequado para entradas grandes.
Ler arquivos ou a entrada padrão com fileinput.input()
Use fileinput.input() quando o mesmo script de processamento de linhas precisar aceitar um ou mais nomes de arquivos como argumentos de linha de comando e também funcionar como filtro. Quando há nomes de arquivos, a função os lê em ordem; quando não há, lê da entrada padrão. Assim, quem chama o programa pode escolher entre um arquivo de entrada nomeado e um pipe sem alterar o loop de processamento.
O código permanece em inglês:
import fileinput
for line in fileinput.input():
print(line.rstrip("\n").upper())
Por exemplo, o script pode ser executado com um nome de arquivo, ou outro comando pode enviar texto a ele por um pipe sem fornecer nenhum nome de arquivo. O código exibido não foi executado conforme o pacote fornecido; não se afirma aqui nenhuma saída de exemplo. Consulte a documentação de fileinput do Python para ver opções como informar o nome do arquivo atual e o número da linha.
Escolher a abordagem adequada
Escolha input() para exibir uma solicitação e ler uma linha, especialmente quando uma pessoa interage com o programa. Escolha sys.stdin quando o programa processar um fluxo arbitrário, precisar lidar com várias linhas ou consumir o fluxo inteiro com read(). Escolha fileinput.input() quando o mesmo programa orientado a linhas precisar processar nomes de arquivos da linha de comando ou recorrer à entrada padrão.
Lembre-se de que input() retorna texto, mesmo quando a resposta parece numérica. Ao processar um fluxo, decida se os espaços em branco ao redor de cada linha fazem parte dos dados antes de removê-los. Ao ler o fluxo inteiro, considere que o programa só termina depois do EOF. Essas diferenças ajudam a escolher uma API adequada à origem e ao tamanho da entrada.