2008-10-05 36 views

Respuesta

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

+12

+1. Creo que esto es mejor que la solución aceptada, ya que no se mezcla con el separador de líneas de forma explícita. ¡Todo funciona solo con un método API dedicado! – lpapp

+7

@lpapp, estoy totalmente de acuerdo. splitlines() es semánticamente (y funcionalmente, ya que utiliza nuevas líneas universales y omite una línea vacía final) mejor que la división ('\ n'). En aquel entonces (2008) yo solo era un novato Pythonista y aunque mis scripts ahora muestran que también estoy usando splitlines() casi exclusivamente. Por lo tanto, borro mi respuesta de 104 puntos (_ * sollozo ... * _) y estaré respaldando esta en su lugar. – efotinis

+14

Esto también hace ''' .splitlines() == []', no '['']' como con ''' .split ('\ n')'. – rightfold

190

Al igual que los otros dijeron:

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

Ésta es idéntica a la anterior, pero las funciones del módulo de cadena están en desuso y se debe evitar:

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

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

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

Esto solo funcionará en sistemas que usan '\ n' como el terminador de línea. –

+19

@Jeremy: Los literales de cadena de comillas triples siempre usan un '\ n' EOL, independientemente de la plataforma. Lo mismo hacen los archivos leídos en modo texto. – efotinis

+3

enlace al método: http://docs.python.org/2/library/stdtypes.html#str.splitlines –

17

podría ser una exageración en este caso particular, pero otra opción consiste en utilizar StringIO para crear un objeto de tipo fichero

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

Sí, este es el enfoque más Python-ic más idiomática. –

+3

Una ventaja de este método, si se compara con 'str.split', se ** Sin necesidad de asignar cualquier memoria ** (se lee la cadena en el lugar). Una desventaja es que es mucho más lento ** si utiliza 'StringIO' ** (aproximadamente 50x). Si utiliza ** 'cStringIO', sin embargo, se trata de 2 veces más rápido ** – goncalopp

39

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

splitlines() maneja adecuadamente los saltos de línea, 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 invoca con un argumento True.


explicación detallada de por qué no debe usar split("\n"):

\n, en Python, representa un salto de línea Unix (código decimal ASCII 10), independientemente de la plataforma en la que se ejecuta . Sin embargo, the linebreak representation is platform-dependent. 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 usted tiene una cadena con los 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 de explícitamente en "\ n", rendirá dependiente de la plataforma comportamiento:

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

Incluso si utiliza os.linesep, sólo será dividido de acuerdo con la nueva línea de separación de la plataforma, y ​​fallará si estás procesamiento de texto creado en otras plataformas, o con un desnudo \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 '] 

Reading files in text mode mitiga parcialmente el problema de la representación de nueva línea, ya que convierte de Python \n en representación de nueva línea de la plataforma. Sin embargo, el modo de texto solo 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 dará lugar a un comportamiento no deseado. Además, no es inusual procesar cadenas con nuevas líneas potencialmente diferentes desde otras fuentes, como desde un socket.

+0

La comparación no es justa, ya que podría utilizar split (os.linesep), también, para evitar el bit específico de la plataforma. – lpapp

+4

@lpapp nota que 'splitlines' se dividirá en cualquier línea * * terminando. 'Split (os.linesep)' fallará cuando se lee un archivo de ventanas de Unix, por ejemplo – goncalopp

+0

Otra razón para utilizar splitlines en mi caso, gracias. Di un +1. Personalmente, incluso incorporaría la información de los comentarios en tu respuesta. – lpapp

1

Deseo que los comentarios tengan un formato de texto de código adecuado, porque creo que la respuesta de @ 1_CR necesita más baches, y me gustaría aumentar su respuesta. De todos modos, Él me llevó a la siguiente técnica; usará cStringIO si está disponible (PERO NOTA: cStringIO y StringIO son no es lo mismo, porque no se puede subclasificar cStringIO ... es un built-in ... pero para operaciones básicas la sintaxis será idéntica, por lo 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() 
Cuestiones relacionadas