Pregunta ¿Cómo puedo eliminar (chomp) una nueva línea en Python?


¿Cuál es el equivalente Python de Perl? chomp función, que elimina el último carácter de una cadena si se trata de una nueva línea?


1328
2017-11-08 18:25


origen


Respuestas:


Prueba el método rstrip() (ver doc. Python 2 y Python 3)

>>> 'test string\n'.rstrip()
'test string'

Python rstrip() tiras de método todas tipos de espacios en blanco al final por defecto, no solo una nueva línea como Perl hace con chomp.

>>> 'test string \n \r\n\n\r \n\n'.rstrip()
'test string'

Para quitar solo nuevas líneas:

>>> 'test string \n \r\n\n\r \n\n'.rstrip('\n')
'test string \n \r\n\n\r '

También están los métodos lstrip() y strip():

>>> s = "   \n\r\n  \n  abc   def \n\r\n  \n  "
>>> s.strip()
'abc   def'
>>> s.lstrip()
'abc   def \n\r\n  \n  '
>>> s.rstrip()
'   \n\r\n  \n  abc   def'

1388
2017-11-09 05:52



Y diría que la forma "pitónica" de obtener líneas sin trazar los caracteres de nueva línea es líneas divisorias ().

>>> text = "line 1\nline 2\r\nline 3\nline 4"
>>> text.splitlines()
['line 1', 'line 2', 'line 3', 'line 4']

139
2017-11-09 00:11



La forma canónica de despojar a los caracteres de fin de línea (EOL) es utilizar el método string rstrip () para eliminar cualquier \ r o \ n final. Aquí hay ejemplos de Mac, Windows y caracteres de EOL de Unix.

>>> 'Mac EOL\r'.rstrip('\r\n')
'Mac EOL'
>>> 'Windows EOL\r\n'.rstrip('\r\n')
'Windows EOL'
>>> 'Unix EOL\n'.rstrip('\r\n')
'Unix EOL'

Usar '\ r \ n' como parámetro para rstrip significa que eliminará cualquier combinación final de '\ r' o '\ n'. Es por eso que funciona en los tres casos anteriores.

Este matiz importa en casos raros. Por ejemplo, una vez tuve que procesar un archivo de texto que contenía un mensaje HL7. El estándar HL7 requiere un '\ r' posterior como su carácter EOL. La máquina de Windows en la que estaba usando este mensaje había agregado su propio carácter de EOL '\ r \ n'. Por lo tanto, el final de cada línea se veía como '\ r \ r \ n'. Usar rstrip ('\ r \ n') hubiera quitado todo el '\ r \ r \ n' que no era lo que yo quería. En ese caso, simplemente corté los dos últimos caracteres en su lugar.

Tenga en cuenta que a diferencia de Perl chomp función, esto quitará todos los caracteres especificados al final de la cadena, no solo uno:

>>> "Hello\n\n\n".rstrip("\n")
"Hello"

125
2017-11-28 17:31



Tenga en cuenta que rstrip no actúa exactamente como la chomp de Perl () porque no modifica la cadena. Es decir, en Perl:

$x="a\n";

chomp $x

resultados en $x siendo "a".

pero en Python:

x="a\n"

x.rstrip()

significará que el valor de x es todavía  "a\n". Incluso x=x.rstrip() no siempre da el mismo resultado, ya que elimina todos los espacios en blanco del final de la cadena, no solo una nueva línea como máximo.


96
2018-03-07 16:07



Podría usar algo como esto:

import os
s = s.rstrip(os.linesep)

Creo que el problema con rstrip("\n") es probable que desee asegurarse de que el separador de línea sea portátil. (Se rumorea que usan algunos sistemas anticuados "\r\n") El otro gotcha es que rstrip eliminará los espacios en blanco repetidos. Ojalá os.linesep contendrá los caracteres correctos. lo anterior funciona para mí.


46
2018-05-13 16:41



Puedes utilizar line = line.rstrip('\n'). Esto quitará todas las líneas nuevas del final de la cadena, no solo una.


37
2018-03-09 08:02



s = s.rstrip()

eliminará todas las líneas nuevas al final de la cadena s. La tarea es necesaria porque rstrip devuelve una nueva cadena en lugar de modificar la cadena original.


28
2018-02-29 22:40



"line 1\nline 2\r\n...".replace('\n', '').replace('\r', '')
>>> 'line 1line 2...'

o siempre puedes ponerte más geek con expresiones regulares :)

¡que te diviertas!


23
2017-11-21 04:29