web-dev-qa-db-fra.com

Comment lire les entrées utilisateur jusqu'à EOF en python?

J'ai rencontré ce problème dans UVa OJ. 272-citations de texte

Eh bien, le problème est assez banal. Mais le fait est que je ne suis pas en mesure de lire l'entrée. L'entrée est fournie sous forme de lignes de texte et la fin de l'entrée est indiquée par EOF. En C/C++, cela peut être fait en exécutant une boucle while:

while( scanf("%s",&s)!=EOF ) { //do something } 

Comment cela peut-il être fait en python.?

J'ai cherché sur le Web mais je n'ai trouvé aucune réponse satisfaisante.

Notez que l'entrée doit être lue depuis la console et non depuis un fichier.

6
rohan

Vous pouvez utiliser le module sys:

import sys

complete_inout = sys.stdin.read()

sys.stdin est un objet de type fichier que vous pouvez traiter comme un objet Fichier Python .

Du doc:

Aide sur la fonction intégrée lire:

méthode read (size = -1, /) de l'instance _io.TextIOWrapper Lit au plus n caractères dans le flux.

Read from underlying buffer until we have n characters or we hit EOF.
If n is negative or omitted, read until EOF.
6
gsi-frank

Vous pouvez lire les entrées depuis la console jusqu'à la fin du fichier en utilisant les modules sys et os en python. J'ai utilisé ces méthodes dans des juges en ligne comme SPOJ à plusieurs reprises.

Première méthode (recommandée):

from sys import stdin

for line in stdin:
    if line == '': # If empty string is read then stop the loop
        break
    process(line) # perform some operation(s) on given string

Notez qu'il y aura un caractère de fin de ligne \n À la fin de chaque ligne que vous lisez. Si vous voulez éviter d’imprimer 2 caractères de fin lors de l’impression line utilisez print(line, end='').

Deuxième méthode:

import os
# here 0 and 10**6 represents starting point and end point in bytes.
lines = os.read(0, 10**6).strip().splitlines() 
for x in lines:
    line = x.decode('utf-8') # convert bytes-like object to string
    print(line)

Cette méthode ne fonctionne pas sur tous les juges en ligne, mais c'est le moyen le plus rapide de lire les entrées à partir d'un fichier ou d'une console.

Troisième méthode:

while True:
    line = input()
    if line == '':
        break
    process(line)

remplacez input() par raw_input() si vous êtes encore en utilisant python 2.

4
MrParadox

Si vous devez lire un caractère à la fois sur le clavier, vous pouvez voir une implémentation de getch en Python: Python lit un seul caractère à l'utilisateur

0
Laurent LAPORTE