Подтвердить что ты не робот

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

Что-то вроде:

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
4b9b3361

Ответ 1

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

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

Ответ 2

Вы не видите вывод из операторов 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

Ответ 3

Если вы хотите убрать 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]

Ответ 4

Кажется, fileinput.FileInput является генератором. Таким образом, вы можете только перебирать его один раз, затем все предметы были использованы и вызывают его следующий метод повышает StopIteration. Если вы хотите перебирать строки более одного раза, их можно поместить в список:

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

Затем наберите rstrip.

Ответ 5

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

Ответ 6

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