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

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

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 

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 rstrip к тому, что пустые строки полностью удаляются (независимо от того, используется ли 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 

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

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

Затем вызовите rstrip на них.

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

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

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