2011-05-01 25 views
6

Estoy tratando de resolver un problema de Krypto en https://www.spoj.pl en Python, que implica la entrada de la consola.Línea de comando de Python - Entrada de línea múltiple

Mi problema es que la cadena de entrada tiene varias líneas, pero se necesita como una sola cadena en el programa. Si solo uso raw_input() y pego (para probar) el texto en la consola, Python lo amenaza como si hubiera presionado enter después de cada línea -> Necesito llamar a raw_input() varias veces en un bucle.

El problema es que no puedo modificar la cadena de entrada de ninguna manera, no tiene ningún símbolo que marca el final y no sé cuántas líneas hay.

Entonces, ¿qué debo hacer?

Respuesta

6

Al llegar al final de la transmisión en la entrada, raw_input devolverá una cadena vacía. Así que si usted realmente necesita para acumular toda la entrada (que probablemente debería ser evitar dadas las limitaciones Spoj), entonces:

buffer = '' 
while True: 
    line = raw_input() 
    if not line: break 

    buffer += line 

# process input 
+1

Intenté esto, pero desafortunadamente esto no parece funcionar. Si presiono Enter luego de pegar el Texto, el programa aún espera más Entrada -> Necesito presionar Enter en la Línea nueva y vacía. SPOJ parece tener un comportamiento similar. – Dreiven

+0

@Dreiven: Elimine el espacio en blanco ('raw_input(). Strip()'). –

+0

Lo intenté, pero no pareció ser el truco. – Dreiven

1

Desde la línea de fin de en Windows está marcado como '\ r \ n' o '\ n' en el sistema Unix es sencillo para reemplazar esos hilos usando

your_input.replace ('\ r \ n ',' ')

+0

No puedo reemplazarlo así porque se invoca raw_input() para cada línea por separado. – Dreiven

+0

Luego tiene que recopilar sus datos en un búfer o en una lista ... esto es sencillo ... –

+0

Tengo que llamar a raw_input() varias veces, una vez por cada línea de mi entrada -> No sé cómo muchas líneas están -> Pruebo Solución PiotrLegnicas -> The Loop no terminará. Eliminar los descansos realmente no es un problema después de reunir toda la información. – Dreiven

1

Desde raw_input() está diseñado para leer una sola línea, es posible que tenga problemas de esta manera. Una solución simple sería poner la cadena de entrada en un archivo de texto y analizar desde allí.

Asumiendo que tiene entrada.txt puede tomar valores como

f = open(r'input.txt','rU') 
for line in f: 
    print line, 
0

Utilizando la mejor respuesta aquí, de todas maneras tendrá un error EOF que debe ser manejado. Entonces, acabo de agregar el manejo de excepciones aquí

buffer = '' 
while True: 
    try: 
     line = raw_input() 
    except EOFError: 
     break 
    if not line: 
     break 

    buffer += line 
Cuestiones relacionadas