如何使用其他脚本删除代码中的尾部空白?
就像是:
import fileinput for lines in fileinput.FileInput("test.txt", inplace=1): lines = lines.strip() if lines == '': continue print lines
但是没有任何东西正在打印在标准输出。
假设一些名为foo
string:
foo.lstrip() # to remove leading white space foo.rstrip() # to remove trailing whitespace foo.strip() # to remove both lead and trailing whitespace
fileinput
似乎是多个inputstream。 这是我会做的:
with open("test.txt") as file: for line in file: line = line.rstrip() if line: print line
您看不到print
语句的任何输出,因为FileInput
在给出关键字参数inplace=1
时将stdout
redirect到input文件。 这将导致input文件被有效地重写,如果你以后再看,那么其中的行确实没有尾随或空白(除了print
语句每一行结尾的换行符)。
如果您只想删除尾随的空格,则应该使用rstrip()
而不是strip()
。 还要注意if lines == '': continue
会导致空行被完全删除(无论strip
还是rstrip
被使用)。
除非你的意图是重写input文件,否则你可能只需要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]
看来,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()
这是sed
真正擅长的事情: $ sed 's/[ \t]*$//'
。 请注意,您可能需要从字面上inputTAB字符而不是\t
才能正常工作。