2017-10-05 5 views
2

Quelle est la meilleure façon de lire dans l'entrée multi-ligne Python 3 lorsque la quantité d'entrée est inconnue? L'entrée multi-ligne sera séparée par ENTRERPython3 meilleure façon de lire l'entrée multi-ligne inconnue

quand j'essayer d'utiliser

while True: 
    line = input() 
    if line: 
      print(line) 
    else: 
      break 

Je reçois un EOFError

Alors si je change à un bloc try-catch

while True: 
    line = input() 
    try: 
      print(line) 
    except EOFError: 
      break 

Je reçois toujours le EOFError.

+2

C'est logique, car l'erreur ne se produit pas à l'impression, mais à 'input()'. Donc ça devrait être dans le 'try'. –

+0

Transférez-vous des données à partir de stdin? Je n'ai jamais vu un EOFError d'appeler 'input' mais je suppose que c'est possible. –

+0

@AdamSmith: oui, si vous utilisez Ctrl + D dans la plupart des terminaux, cela est également vu comme un terminateur. –

Répondre

4

Le EOFError se produit lorsque vous appelez input(), pas lorsque vous testez, ni lors de l'impression. Donc, cela signifie que vous devez mettre input() dans une try clause:

try: 
    line = input() 
    print(line) 
except EOFError: 
    break

Cela dit, si input lit du canal d'entrée standard, vous pouvez l'utiliser comme un itérable:

import sys 

for line in sys.stdin: 
    print(line, end='') 

Depuis chaque line se termine maintenant avec le nouveau caractère de ligne '\n', nous pouvons utiliser end='' dans la fonction print, pour éviter d'imprimer une nouvelle ligne deux fois (une fois de la chaîne, une fois de la print amusant ction).

Je pense que la dernière version est plus élégante, car elle indique presque syntaxiquement que vous itérez sur le stdin et traite les lignes individuellement.

+0

Mais la dernière ligne pourrait causer des problèmes, n'est-ce pas? Imiter 'input()' exactement peut être subtile – Elazar

+0

@Elazar: basé sur [documentation] (https://docs.python.org/3/library/functions.html#input) d'entrée, il lit depuis stdin, dépouille la nouvelle ligne, et renvoie cela. Et soulève un 'EOFError' dans le cas où il a un caractère EOF. C'est exactement ce que fait le protocole d'itérateur sur un 'stdin' (sauf qu'il termine la boucle dans le cas d'un EOF, et qu'il ne dépouille pas la nouvelle ligne). –