cómo leer una cadena larga de varias líneas línea por línea en Python

84

Tengo un golpe de cuerda con muchas líneas. ¿Cómo leo las líneas una a una con una forcláusula? Esto es lo que estoy tratando de hacer y obtengo un error en la var textData a la que se hace referencia en la for line in textDatalínea.

for line in textData
    print line
    lineResult = libLAPFF.parseLine(line)

La variable textData existe, la imprimo antes de bajar, pero creo que el precompilador está provocando el error.

TIA

Dennis

DKean
fuente
Necesita dividir su línea en cadenas separadas. Tener una "/ n" no la convierte en una cadena separada.
N_A
¿Qué error está obteniendo (con el rastreo)? ¿Cuál es el valor en textData? ¿Puede darnos un SSCCE , algo que podamos ejecutar y ver el mismo problema que usted para que podamos explicárselo?
abarnert
Además, ¿cuál es el "precompilador" que cree que está "provocando el error"?
abarnert

Respuestas:

142

¿Qué pasa con el uso .splitlines()?

for line in textData.splitlines():
    print(line)
    lineResult = libLAPFF.parseLine(line)
Benjamin Gruenbaum
fuente
@BenjaminGruenbaum: "/r"y "/n"son solo cadenas normales de dos caracteres que constan de una barra y una letra. ¿Quiso decir "\n"?
abarnert
¿Es una copia o un iterador?
user3226167
@ user3226167 devuelve una lista .
Benjamin Gruenbaum
¿Existe una versión de iterador de splitlines que no crearía una lista, sino que volvería en el iterador?
Youda008
Existe StringIO, pero es una interfaz de nivel inferior. Dicho esto, en este caso ya tiene una cadena; si desea iterar un iterador (un archivo, por ejemplo) línea por línea, esa es otra pregunta. Recuerde: en este caso, ya tiene una cadena.
Benjamin Gruenbaum
6

dividiendo con nuevas líneas.

for line in wallop_of_a_string_with_many_lines.split('\n'):
  #do_something..

si itera sobre una cadena, está iterando char por char en esa cadena, no por línea.

>>>string = 'abc'
>>>for line in string:
    print line

a
b
c
thkang
fuente
Para cualquiera que lea esto ahora, use la función str.splitlines () en su lugar. Algunos casos extremos surgen con esta solución. Por ej. digamos que itera sobre cada línea, si hay un \ n al final de la línea final del objeto, entonces su bucle for intentará realizar una tarea en una línea vacía causando errores. Discutido anteriormente en solución aceptada.
thefrollickingnerd
1

Esta respuesta falla en un par de casos extremos (ver comentarios). La solución aceptada anterior se encargará de estos. str.splitlines()es el camino a seguir. Dejaré esta respuesta sin embargo como referencia.

Respuesta antigua (incorrecta):

s =  \
"""line1
line2
line3
"""

lines = s.split('\n')
print(lines)
for line in lines:
    print(line)
PR
fuente
Gracias, @PR también me enseñaste algo. No tenía ni idea sobre elimport re
DKean
¿Por qué usarías en re.splitlugar de str.split(o splitlines) solo para dividir en caracteres de nueva línea? Construir una expresión regular a partir de un único carácter literal estático es simplemente complicar las cosas sin ninguna razón.
abarnert
@PR Para encajar con la discusión anterior, creo que debería haber escrito s.split ('\ n'). Dividir con r '\ n' no funciona.
David Epstein
copiar y pegar mi código funciona para mí (solo lo probé). pero mirándolo ahora (después de 3 años, podría haberlo usado s.split. Cambiarlo ahora
PR
1
split('\n')retendrá cualquier \rcarácter dentro de la picadura. Los retornos de carro no se eliminarán, lo que podría ser un problema.
Palillo de dientes Anemone