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.
+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
@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
Esto también hace ''' .splitlines() == []', no '['']' como con ''' .split ('\ n')'. – rightfold