Как удалить конечные пробелы в коде, используя другой скрипт?
что-то типа:
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 ответов:
fileinput
Кажется, для нескольких входных потоков. Вот что я бы сделал:with open("test.txt") as file: for line in file: line = line.rstrip() if line: print(line)
вы не видите никакого выхода из
FileInput
редиректыstdout
во входной файл, когда ключевое слово аргументinplace=1
дается. Это приводит к тому, что входной файл будет эффективно переписан, и если вы посмотрите на него позже, строки в нем действительно не будут иметь в них конечных или ведущих пробелов (за исключением новой строки в конце каждого из которыхесли вы хотите удалить только конечные пробелы, вы должны использовать
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. Если вы хотите перебирать строки более одного раза, вы можете поместить их в список:
вызов rstrip на них.list(fileinput.FileInput('test.txt'))