Question Comment puis-je supprimer (chomp) un saut de ligne en Python?


Quel est l'équivalent Python de Perl's chomp fonction, qui supprime le dernier caractère d'une chaîne s'il s'agit d'un saut de ligne?


1328
2017-11-08 18:25


origine


Réponses:


Essayez la méthode rstrip() (voir doc Python 2 et Python 3)

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

Python rstrip() bandes de méthode tout types d'espaces de fin par défaut, pas seulement un retour à la ligne comme le fait Perl avec chomp.

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

Pour ne supprimer que les nouvelles lignes:

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

Il y a aussi les méthodes lstrip() et 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



Et je dirais que la façon "pythonique" d'obtenir des lignes sans caractère de fin de ligne est splitlines ().

>>> 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 manière canonique de supprimer les caractères de fin de ligne (EOL) consiste à utiliser la méthode string rstrip () en supprimant tout caractère \ r ou \ n. Voici des exemples de caractères Mac, Windows et Unix EOL.

>>> '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'

Utiliser '\ r \ n' comme paramètre de rstrip signifie qu'il supprimera toute combinaison de '\ r' ou '\ n'. C'est pourquoi cela fonctionne dans les trois cas ci-dessus.

Cette nuance est importante dans de rares cas. Par exemple, j'ai dû traiter un fichier texte contenant un message HL7. La norme HL7 requiert un caractère \ "comme" caractère EOL ". La machine Windows sur laquelle j'utilisais ce message avait ajouté son propre caractère EOL '\ r \ n'. Par conséquent, la fin de chaque ligne ressemblait à '\ r \ r \ n'. Utiliser rstrip ('\ r \ n') aurait enlevé tout le '\ r \ r \ n' ce qui n'est pas ce que je voulais. Dans ce cas, j'ai simplement découpé les deux derniers caractères à la place.

Notez que contrairement à Perl chomp fonction, cela supprimera tous les caractères spécifiés à la fin de la chaîne, pas seulement un:

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

125
2017-11-28 17:31



Notez que rstrip n'agit pas exactement comme chomp () de Perl car il ne modifie pas la chaîne. C'est, en Perl:

$x="a\n";

chomp $x

résulte en $x étant "a".

mais en Python:

x="a\n"

x.rstrip()

signifiera que la valeur de x est encore  "a\n". Même x=x.rstrip() ne donne pas toujours le même résultat, car il supprime tous les espaces de la fin de la chaîne, et pas seulement une nouvelle ligne.


96
2018-03-07 16:07



Je pourrais utiliser quelque chose comme ceci:

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

Je pense que le problème avec rstrip("\n") est que vous voudrez probablement vous assurer que le séparateur de ligne est portable. (Certains systèmes obsolètes sont répandus pour utiliser "\r\n"). L'autre gotcha est que rstrip supprimera les espaces blancs répétés. Espérons os.linesep contiendra les bons caractères. ce qui précède fonctionne pour moi.


46
2018-05-13 16:41



Vous pouvez utiliser line = line.rstrip('\n'). Cela supprimera toutes les nouvelles lignes de la fin de la chaîne, pas une seule.


37
2018-03-09 08:02



s = s.rstrip()

va supprimer toutes les nouvelles lignes à la fin de la chaîne s. L'affectation est nécessaire car rstrip renvoie une nouvelle chaîne au lieu de modifier la chaîne d'origine.


28
2018-02-29 22:40



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

ou vous pourriez toujours obtenir plus geekier avec regexps :)

s'amuser!


23
2017-11-21 04:29



vous pouvez utiliser strip:

line = line.strip()

démo:

>>> "\n\n hello world \n\n".strip()
'hello world'

19
2018-04-27 11:43