类似的东西:
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
答案 0 :(得分:59)
fileinput
似乎适用于多个输入流。这就是我要做的事情:
with open("test.txt") as file:
for line in file:
line = line.rstrip()
if line:
print(line)
答案 1 :(得分:9)
您没有看到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
答案 2 :(得分:5)
如果你想整理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]
答案 3 :(得分:3)
这是sed
非常擅长的事情:$ sed 's/[ \t]*$//'
。请注意,您可能需要输入一个TAB字符而不是\t
才能使其正常工作。
答案 4 :(得分:3)
看来,fileinput.FileInput是一个生成器。因此,您只能迭代一次,然后所有项目都已消耗并调用它 next 方法引发 StopIteration 。如果您想多次迭代这些行,可以将它们放在一个列表中:
list(fileinput.FileInput('test.txt'))
然后在他们身上调用 rstrip 。
答案 5 :(得分:3)
另存为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 :(得分:0)
看到有多个答案建议使用python
来完成此任务,这有点令人惊讶,因为无需为此编写多行程序。
sed
,awk
或perl
之类的标准Unix工具可以直接从命令行轻松实现。
例如,在您拥有perl
的任何地方(通常是Windows,Mac,Linux),以下操作均应达到操作要求:
perl -i -pe 's/[ \t]+$//;' files...
说明perl
的参数:
-i # run the edit "in place" (modify the original file)
-p # implies a loop with a final print over every input line
-e # next arg is the perl expression to apply (to every line)
s/[ \t]$//
是s / FROM / TO /的替代正则表达式:将所有尾随(行尾)非空空间(空格或制表符)全部替换为空。
优势:
更一般而言,如果您想直接从命令行修改任意数量的文件,将FOO
的每个外观替换为BAR
,则可以始终使用以下通用模板:
perl -i -pe 's/FOO/BAR/' files...