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 ?

67voto

nmichaels Points 21955

fileinput semble être pour les flux d'entrée multiples. Voici ce que je ferais :

with open("test.txt") as file:
    for line in file:
        line = line.rstrip()
        if line:
            print(line)

0 votes

J'obtiens une erreur : ./fix2.py Fichier "./fix2.py", ligne 2 avec le fichier comme open("xmlrunner.py") : SyntaxError : can't assign to function call (Impossible d'assigner à un appel de fonction)

0 votes

C'est l'inverse, avec open(bla) as file : ... aussi, je supprimerais le continue : if line : print line

0 votes

@kamal : Hah, j'ai eu le with à l'envers. C'est corrigé maintenant.

12voto

martineau Points 21665

Vous ne voyez pas de sortie du print parce que FileInput redirige vers stdout au fichier d'entrée lorsque l'argument mot-clé inplace=1 est donnée. Cela entraîne la réécriture du fichier d'entrée et si vous le regardez par la suite, les lignes n'auront plus d'espace à la fin ou au début (à l'exception de la nouvelle ligne à la fin de chaque ligne que la commande print la déclaration ajoute en retour).

Si vous voulez seulement supprimer les espaces blancs de fin de ligne, vous devriez utiliser rstrip() au lieu de strip() . Notez également que le if lines == '': continue fait en sorte que les lignes vides soient complètement supprimées (sans tenir compte du fait que l'option strip ou rstrip est utilisé).

A moins que votre intention ne soit de réécrire le fichier d'entrée, vous devriez probablement juste utiliser for line in open(filename): . Sinon, vous pouvez voir ce qui est écrit dans le fichier en envoyant simultanément l'écho de la sortie à sys.stderr en utilisant quelque chose comme ce qui suit (qui fonctionnera à la fois dans Python 2 et 3) :

from __future__ import print_function
import fileinput
import sys

for line in (line.rstrip() for line in
                fileinput.FileInput("test.txt", inplace=1)):
    if line:
        print(line)
        print(line, file=sys.stderr)

6voto

Thelonious Points 1038

Si vous cherchez à mettre de l'ordre dans votre projet pour PEP8, ceci va supprimer les espaces blancs de fin de ligne pour l'ensemble de votre projet :

import os

PATH = '/path/to/your/project'

for path, dirs, files in os.walk(PATH):
    for f in files:
        file_name, file_extension = os.path.splitext(f)
        if file_extension == '.py':
            path_name = os.path.join(path, f)
            with open(path_name, 'r') as fh:
                new = [line.rstrip() for line in fh]
            with open(path_name, 'w') as fh:
                [fh.write('%s\n' % line) for line in new]

2 votes

Necro-commentaire : À la toute fin, au lieu de gaspiller des ressources à créer une liste à jeter, il serait plus efficace d'utiliser un seul appel de sortie de fichier avec un argument qui était une expression de générateur : i.e. fh.writelines((line+'\n' for line in new)) .

3voto

Czarek Tomczak Points 4551

Enregistrer sous fix_whitespace.py :

#!/usr/bin/env python
"""
Fix trailing whitespace and line endings (to Unix) in a file.
Usage: python fix_whitespace.py foo.py
"""

import os
import sys

def main():
    """ Parse arguments, then fix whitespace in the given file """
    if len(sys.argv) == 2:
        fname = sys.argv[1]
        if not os.path.exists(fname):
            print("Python file not found: %s" % sys.argv[1])
            sys.exit(1)
    else:
        print("Invalid arguments. Usage: python fix_whitespace.py foo.py")
        sys.exit(1)
    fix_whitespace(fname)

def fix_whitespace(fname):
    """ Fix whitespace in a file """
    with open(fname, "rb") as fo:
        original_contents = fo.read()
    # "rU" Universal line endings to Unix
    with open(fname, "rU") as fo:
        contents = fo.read()
    lines = contents.split("\n")
    fixed = 0
    for k, line in enumerate(lines):
        new_line = line.rstrip()
        if len(line) != len(new_line):
            lines[k] = new_line
            fixed += 1
    with open(fname, "wb") as fo:
        fo.write("\n".join(lines))
    if fixed or contents != original_contents:
        print("************* %s" % os.path.basename(fname))
    if fixed:
        slines = "lines" if fixed > 1 else "line"
        print("Fixed trailing whitespace on %d %s" \
              % (fixed, slines))
    if contents != original_contents:
        print("Fixed line endings to Unix (\\n)")

if __name__ == "__main__":
    main()

3voto

Hank Gay Points 36173

C'est le genre de chose que sed est vraiment bon pour : $ sed 's/[ \t]*$//' . Sachez que vous aurez probablement besoin de taper littéralement un caractère TAB au lieu de \t pour que cela fonctionne.

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