web-dev-qa-db-fra.com

Comment lire ligne par ligne depuis stdin en python

Tout le monde sait compter les caractères de STDIN en C. Cependant, quand j'ai essayé de le faire en python3, je trouve que c'est un puzzle. (counter.py)

import sys
chrCounter = 0

for line in sys.stdin.readline():
    chrCounter += len(line)

print(chrCounter)

Ensuite, j'essaie de tester le programme en

python3 counter.py < counter.py

La réponse n'est que la longueur de la première ligne "import sys". En fait, le programme lit UNIQUEMENT la première ligne de l'entrée standard et supprime les autres.

Ce sera un travail si je remplace sys.stdin.readline par sys.stdin.read ()

import sys
print(len(sys.stdin.read()))

Cependant, il est évident que le programme n'est PAS adapté à une grande entrée. Veuillez me donner une solution élégante. Je vous remercie!

17
Storm-Eyes

C'est plus simple:

for line in sys.stdin:
    chrCounter += len(line)

L'objet de type fichier sys.stdin Est automatiquement itéré ligne par ligne; si vous appelez .readline() dessus, vous ne lisez que la première ligne (et parcourez ce caractère par caractère); si vous appelez read(), vous lirez l'intégralité de l'entrée dans une seule chaîne et itérerez sur that caractère par caractère.

30
Tim Pietzcker

Si je voulais juste un nombre de caractères, je lirais des blocs à la fois au lieu de lignes à la fois:

# 4096 chosen arbitrarily. Pick any other number you want to use.
print(sum(iter(lambda:len(sys.stdin.read(4096)), 0)))
0
Robᵩ

La réponse de Tim Pietzcker est à mon humble avis la bonne. Il existe 2 façons similaires de procéder. En utilisant:

for line in sys.stdin:

et

for line in sys.stdin.readlines():

La deuxième option est plus proche de votre code d'origine. La différence entre ces deux options est clairement indiquée en utilisant par exemple la modification suivante du corps de la boucle for et en utilisant le clavier pour la saisie:

for line in sys.stdin.readlines():
    line_len = len(line)
    print('Last line was', line_len, 'chars long.')
    chrCounter += len(line)

Si vous utilisez la première option (for line in sys.stdin:), Les lignes sont traitées juste après avoir appuyé sur Entrée.

Si vous utilisez la deuxième option (for line in sys.stdin.readlines():), le fichier entier est d'abord lu, divisé en lignes et ensuite seulement il est traité.

0
Posa