如何使用另一个脚本删除代码中的尾随空格?

时间:2011-03-23 21:04:11

标签: python

类似的东西:

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

7 个答案:

答案 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导致空行被完全删除(无论是否使用striprstrip)。

除非您的意图是重写输入文件,否则您应该只使用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来完成此任务,这有​​点令人惊讶,因为无需为此编写多行程序。

sedawkperl之类的标准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...