66 votes

Comment supprimer les espaces blancs de fin de code, en utilisant un autre script ?

Quelque chose comme :

import fileinput

for lines in fileinput.FileInput("test.txt", inplace=1):
    lines = lines.strip()
    if lines == '': continue
    print lines

Mais rien n'est imprimé sur stdout.

En supposant qu'une chaîne nommée foo :

foo.lstrip() # to remove leading white space
foo.rstrip() # to remove trailing whitespace
foo.strip()  # to remove both lead and trailing whitespace

1 votes

Vous êtes sûr que ce n'est pas lié à l'utilisation de fileinput.FileInput à la place ?

3voto

XORcist Points 2385

Il semble que le fichier FileInput soit un générateur. En tant que tel, vous ne pouvez l'itérer qu'une seule fois, une fois que tous les éléments ont été consommés et en appelant sa fonction suivant La méthode soulève StopIteration . Si vous voulez itérer sur les lignes plus d'une fois, vous pouvez les mettre dans une liste :

list(fileinput.FileInput('test.txt'))

Ensuite, appelez rstrip sur eux.

2voto

arielf Points 704

C'est un peu surprenant de voir que de nombreuses réponses suggèrent d'utiliser python pour cette tâche, car il n'y a pas besoin d'écrire un programme de plusieurs lignes pour cela.

Les outils Unix standard comme sed , awk ou perl peut y parvenir facilement, directement à partir de la ligne de commande.

Par exemple, partout où vous avez perl (Windows, Mac, Linux), ce qui suit devrait permettre de répondre à la demande de l'OP :

perl -i -pe 's/[ \t]+$//;' files...

Explication des arguments pour perl :

-i   # run the edit "in place" (modify the original file)
-p   # implies a loop with a final print over every input line
-e   # next arg is the perl expression to apply (to every line)

s/[ \t]$// est une regex de substitution s/FROM/TO/ : remplace chaque espace non vide de fin de ligne (espaces ou tabulations) par rien.

Avantages :

  • One liner, aucune programmation nécessaire
  • Fonctionne sur plusieurs (n'importe quel nombre) de fichiers
  • Fonctionne correctement sur l'entrée standard (aucun argument de fichier n'est donné).

Edit :

Les versions plus récentes de perl soutien \h (tout caractère d'espacement horizontal), la solution devient donc encore plus courte :

perl -i -pe 's/\h+$//;' files...

Plus généralement, si vous voulez modifier un certain nombre de fichiers directement à partir de la ligne de commande, en remplaçant chaque apparition de FOO avec BAR vous pouvez toujours utiliser ce modèle générique :

perl -i -pe 's/FOO/BAR/' files...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X