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.
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.
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.
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