web-dev-qa-db-fra.com

Qu'est-ce qui permet de supprimer rapidement les lignes vides d'une chaîne python

J'ai du code dans une chaîne python qui contient des lignes vides superflues. Je voudrais supprimer toutes les lignes vides de la chaîne. Quelle est la façon la plus pythonique de le faire?

Remarque: je ne cherche pas un reformulateur de code général, mais juste une ou deux lignes rapides. 

Merci!

46
Andrew Wagner

Que diriez-vous:

text = os.linesep.join([s for s in text.splitlines() if s])

text est la chaîne avec les lignes superflues possibles?

71
Lawrence Johnston
"\n".join([s for s in code.split("\n") if s])

Edit2:

text = "".join([s for s in code.splitlines(True) if s.strip("\r\n")])

Je pense que c'est ma version finale. Cela devrait bien fonctionner même avec les fins de ligne de mélange. Je ne pense pas que cette ligne avec des espaces devrait être considérée comme vide, mais si c'est le cas, alors simple s.strip () fera l'affaire. 

14
Wojciech Bederski
filter(None, code.splitlines())
filter(str.strip, code.splitlines())

sont équivalents à

[s for s in code.splitlines() if s]
[s for s in code.splitlines() if s.strip()]

et pourrait être utile pour la lisibilité

11
ymv

LEÇON SUR L'ENLEVEMENT DE NEWLINES ET DES LIGNES VIDES AVEC ESPACES

"t" est la variable avec le texte. Vous verrez une variable "s", c’est une variable temporaire qui n’existe que pendant l’évaluation de l’ensemble des parenthèses principales (j'ai oublié le nom de ces choses lil python)

Commençons par définir la variable "t" pour qu'elle ait de nouvelles lignes:

>>> t='hi there here is\na big line\n\nof empty\nline\neven some with spaces\n       \nlike that\n\n    \nokay now what?\n'

Notez qu'il existe un autre moyen de définir la varible à l'aide de guillemets triples

somevar="""
   asdfas
asdf

  asdf

  asdf

asdf
""""

Voici à quoi ça ressemble quand on le voit sans "print":

>>> t
'hi there here is\na big line\n\nof empty\nline\neven some with spaces\n       \nlike that\n\n    \nokay now what?\n' 

Pour voir avec les nouvelles lignes réelles, imprimez-le.

>>> print t
hi there here is
a big line

of empty
line
even some with spaces

like that


okay now what?

COMMAND SUPPRIMER TOUTES LES LIGNES VIDES (Y COMPRIS LES ESPACES):

Ainsi, certaines nouvelles lignes ne sont que des nouvelles lignes, et certaines ont des espaces afin de ressembler à de nouvelles lignes

Si vous souhaitez vous débarrasser de toutes les lignes vides (si elles ne contiennent que des nouvelles lignes ou des espaces)

>>> print "".join([s for s in t.strip().splitlines(True) if s.strip()])
hi there here is
a big line
of empty
line
even some with spaces
like that
okay now what?

OU:

>>> print "".join([s for s in t.strip().splitlines(True) if s.strip("\r\n").strip()])
hi there here is
a big line
of empty
line
even some with spaces
like that
okay now what?

REMARQUE: cette bande dans t.strip (). Splitline (True) peut être supprimée de sorte que ses lignes seulement t.splitlines (True), mais votre sortie peut se terminer par une nouvelle ligne (de sorte que la nouvelle ligne finale soit supprimée). Strip () dans la dernière partie de s.strip ("\ r\n"). Strip () et s.strip () est ce qui supprime réellement les espaces dans les nouvelles lignes et les nouvelles lignes.

COMMAND SUPPRIMER TOUTES LES LIGNES BLANK (MAIS PAS AVEC LES ESPACES):

Techniquement, les lignes avec des espaces ne doivent PAS être considérées comme vides, mais tout dépend du cas d'utilisation et des objectifs recherchés.

>>> print "".join([s for s in t.strip().splitlines(True) if s.strip("\r\n")])
hi there here is
a big line
of empty
line
even some with spaces

like that

okay now what?

** NOTE SUR CETTE BANDE MIDDLE **

La bande du milieu, attachée à la variable "t", supprime simplement la dernière nouvelle ligne (comme l’a dit la note précédente). Voici à quoi cela pourrait ressembler sans cette bande (remarquez la dernière nouvelle ligne)

Avec 1er exemple (suppression des nouvelles lignes et des nouvelles lignes avec des espaces)

>>> print "".join([s for s in t.strip().splitlines(True) if s.strip("\r\n").strip()])
hi there here is
a big line
of empty
line
even some with spaces
like that
okay now what?
.without strip new line here (stackoverflow cant have me format it in).

Avec 2ème exemple (suppression des nouvelles lignes uniquement)

>>> print "".join([s for s in t.strip().splitlines(True) if s.strip("\r\n")])
hi there here is
a big line
of empty
line
even some with spaces

like that

okay now what?
.without strip new line here (stackoverflow cant have me format it in).

La fin!

9
kossboss

En utilisant re.sub function

re.sub(r'^$\n', '', s, flags=re.MULTILINE)
3
fbessho

Celui-ci supprimera aussi les lignes d'espaces.

re.replace(u'(?imu)^\s*\n', u'', code)

2
peterdemin

Voici une solution en une ligne:

print("".join([s for s in mystr.splitlines(True) if s.strip()]))
1
jasonleonhard

en développant la réponse de ymv, vous pouvez utiliser filter avec join pour obtenir la chaîne souhaitée,

"".join(filter(str.strip, sample_string.splitlines(True)))
0
Sufiyan Ghori

Et maintenant pour quelque chose de complètement différent:

Python 1.5.2 (#0, Apr 13 1999, 10:51:12) [MSC 32 bit (Intel)] on win32
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> import string, re
>>> tidy = lambda s: string.join(filter(string.strip, re.split(r'[\r\n]+', s)), '\n')
>>> tidy('\r\n   \n\ra\n\n   b   \r\rc\n\n')
'a\012   b   \012c'

Épisode 2:

Celui-ci ne fonctionne pas sur 1.5 :-(

MAIS non seulement il gère les sauts de ligne universels et les lignes vides, il supprime également les espaces blancs de fin (bonne idée lorsque vous rangez les lignes de code à mon humble avis) et effectue un travail de réparation si la dernière ligne significative n’est pas terminée.

import re
tidy = lambda c: re.sub(
    r'(^\s*[\r\n]+|^\s*\Z)|(\s*\Z|\s*[\r\n]+)',
    lambda m: '\n' if m.lastindex == 2 else '',
    c)
0
John Machin