length python string

python - length - ¿Cómo divido una cadena multilínea en múltiples líneas?



python string substring (6)

Como decían los demás:

inputString.split(''/n'') # --> [''Line 1'', ''Line 2'', ''Line 3'']

Esto es idéntico al anterior, pero las funciones del módulo de cadena están en desuso y deben evitarse:

import string string.split(inputString, ''/n'') # --> [''Line 1'', ''Line 2'', ''Line 3'']

Alternativamente, si desea que cada línea incluya la secuencia de ruptura (CR, LF, CRLF), use el método de splitlines con un argumento True :

inputString.splitlines(True) # --> [''Line 1/n'', ''Line 2/n'', ''Line 3'']

Tengo un literal de cadena multilínea que quiero hacer una operación en cada línea, así:

inputString = """Line 1 Line 2 Line 3"""

Quiero hacer algo como lo siguiente:

for line in inputString: doStuff()


La mejor manera de hacer esto es simplemente usar str.splitlines .

splitlines() maneja las nuevas líneas correctamente, a diferencia de split("/n") .

También tiene la ventaja mencionada por @efotinis de incluir opcionalmente el carácter de nueva línea en el resultado dividido cuando se llama con un argumento True .

Explicación detallada de por qué no debe usar split("/n") :

/n , en Python, representa un salto de línea de Unix (código decimal ASCII 10), independientemente de la plataforma donde lo ejecute. Sin embargo, la representación de linebreak es dependiente de la plataforma . En Windows, /n son dos caracteres, CR y LF (códigos decimales ASCII 13 y 10, AKA /r y /n ), mientras que en cualquier Unix moderno (incluido OS X), es el único carácter LF .

print , por ejemplo, funciona correctamente incluso si tiene una cadena con finales de línea que no coinciden con su plataforma:

>>> print " a /n b /r/n c " a b c

Sin embargo, la división explícita en "/ n" producirá un comportamiento dependiente de la plataforma:

>>> " a /n b /r/n c ".split("/n") ['' a '', '' b /r'', '' c '']

Incluso si usa os.linesep , solo se dividirá de acuerdo con el separador de nueva línea en su plataforma, y ​​fallará si está procesando texto creado en otras plataformas, o con un simple /n :

>>> " a /n b /r/n c ".split(os.linesep) ['' a /n b '', '' c '']

splitlines resuelve todos estos problemas:

>>> " a /n b /r/n c ".splitlines() ['' a '', '' b '', '' c '']

La lectura de archivos en modo de texto mitiga parcialmente el problema de representación de nueva línea, ya que convierte a /n Python''s en la representación de nueva línea de la plataforma. Sin embargo, el modo de texto sólo existe en Windows. En los sistemas Unix, todos los archivos se abren en modo binario, por lo que usar split(''/n'') en un sistema UNIX con un archivo de Windows conducirá a un comportamiento no deseado. Además, no es inusual procesar cadenas con nuevas líneas potencialmente diferentes de otras fuentes, como desde un socket.


La publicación original solicitó el código que imprime algunas filas (si son verdaderas para alguna condición) más la fila siguiente. Mi implementación sería esta:

text = """1 sfasdf asdfasdf 2 sfasdf asdfgadfg 1 asfasdf sdfasdgf """ text = text.splitlines() rows_to_print = {} for line in range(len(text)): if text[line][0] == ''1'': rows_to_print = rows_to_print | {line, line + 1} rows_to_print = sorted(list(rows_to_print)) for i in rows_to_print: print(text[i])


Me gustaría que los comentarios tuvieran el formato correcto del texto del código, porque creo que la respuesta de @ 1_CR necesita más baches, y me gustaría aumentar su respuesta. De todos modos, me llevó a la siguiente técnica; usará cStringIO si está disponible (PERO NOTA: cStringIO y StringIO no son lo mismo , porque no puede crear subclases de cStringIO ... está integrado ... pero para las operaciones básicas, la sintaxis será idéntica, así que puede hacer esto ):

try: import cStringIO StringIO = cStringIO except ImportError: import StringIO for line in StringIO.StringIO(variable_with_multiline_string): pass print line.strip()


Podría ser una exageración en este caso particular, pero otra opción implica usar StringIO para crear un objeto similar a un archivo

for line in StringIO.StringIO(inputString): doStuff()


inputString.splitlines()

Le dará una lista con cada elemento, el método splitlines() está diseñado para dividir cada línea en un elemento de lista.