Как удалить конечные пробелы в коде, используя другой скрипт?


что-то типа:

import fileinput

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

но ничего не печатается в stdout.

предполагая некоторую строку с именем foo:

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

6 ответов:

fileinput Кажется, для нескольких входных потоков. Вот что я бы сделал:

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

вы не видите никакого выхода из print отчетность за FileInput редиректы stdout во входной файл, когда ключевое слово аргумент inplace=1 дается. Это приводит к тому, что входной файл будет эффективно переписан, и если вы посмотрите на него позже, строки в нем действительно не будут иметь в них конечных или ведущих пробелов (за исключением новой строки в конце каждого из которых print оператор добавляет обратно).

если вы хотите удалить только конечные пробелы, вы должны использовать rstrip() вместо strip(). Также обратите внимание, что if lines == '': continue вызывает полное удаление пустых строк (независимо от того,strip или rstrip привыкает).

если вы не намерены переписать входной файл, вы, вероятно, должны просто использовать for line in open(filename):. В противном случае вы можете увидеть, что записывается в файл, одновременно повторяя вывод в sys.stderr используя что-то вроде следующего:

import fileinput
import sys

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

Если вы хотите привести в порядок для PEP8, это будет обрезать конечные пробелы для всего вашего проекта:

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]

Сохранить как 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()

Кажется, fileinput.FileInput-это генератор. Таким образом, вы можете только повторить его один раз, а затем все элементы были потреблены и вызов it's далее вызывает метод StopIteration. Если вы хотите перебирать строки более одного раза, вы можете поместить их в список:

list(fileinput.FileInput('test.txt'))
вызов rstrip на них.

Это то, что sed и действительно хорошо: $ sed 's/[ \t]*$//'. Имейте в виду, что вам, вероятно, нужно будет буквально ввести символ табуляции вместо \t чтобы это работало.