【问题标题】:one liner for removing blank lines from a file in python?一个用于从 python 文件中删除空行的衬垫?
【发布时间】:2011-07-21 17:55:56
【问题描述】:

我正在寻找一种可以从 python 文件中删除所有空行的衬垫。 python 等价于 --> grep -v '^$' file_name > file_name

【问题讨论】:

  • Python 通常不适合单行代码,但应该可以编写一个简短的程序。
  • 为什么需要单线?

标签: python


【解决方案1】:
lines = [i for i in open(file_path) if i[:-1]]

如果需要写入另一个文件,您可以使用file_object.writelines(lines)打开文件进行写入。

【讨论】:

  • 在单行中with 如何更安全?
  • 将理解更改为循环不会改变任何内容,但我认为将 with 更改为内联 open() 更容易出错。为什么单排会改变一些事情?
  • IIRC,with 在文件上下文中的全部意义在于确保文件被关闭。由于所有文件都会在终止时关闭,因此with 在这里没有任何区别。
  • bool(line.rsplit()) 不等于否定 ^$ 匹配。 bool(line[:-1]) 是。
  • @DzinX,我的错误,应该是 i.rstrip(),但由于空列表也是错误的,所以确实有效。编辑:是的,我注意到它也会删除带有空格的行。但我真的不认为这会是问题,但无论如何改变了答案。
【解决方案2】:

以下内容不是单行的,但可以完成工作并且易于阅读:

for line in open(filename):
  line = line.rstrip()
  if line != '':
    print line

这会将结果打印到标准输出。修改此代码以在其他地方打印是微不足道的。

如果您坚持,将其转换为单线是相当容易的:

''.join(l for l in open(filename) if l.rstrip())

【讨论】:

  • 不是一个单行,引用 Python 文档,“!= 也可以写成 ,但这是一种过时的用法,仅用于向后兼容。新代码应始终使用!=。 "。
  • @agf:你们如何设法评论旧版本的答案?这是某种复制问题吗?在您发表评论之前,我已经删除了 <>
  • 击败我。此外,在这种情况下,即使是 != 也是不必要的,因为空字符串的计算结果为 false,如果您正在执行多线程,为什么不使用 with
【解决方案3】:

一个无环的:

open('dst','w').write(re.sub('\n\s*\n+','\n', open('src').read()))

【讨论】:

  • +1 虽然我最终使用它来满足我的需要: open('dst','w').write(re.sub('\n[\t\s]*\n+' ,'\n', open('src').read())) 任意组合匹配制表符和空格,以防万一。
【解决方案4】:

filter(bool, map(lambda x:x.rstrip(), open(filename)))

【讨论】:

  • 您可以使用 str.rstrip 作为键,而不是创建 lambda 函数。
  • 这很好,但它不是等效的,因为它不会关闭文件,不会在非空行中保留空格,也不会将输出写入结果文件。跨度>
【解决方案5】:

如果您需要真正的单线:

python -c 'import sys; print "".join(l for l in sys.stdin.readlines() if l.strip()),'

可以在你的shell中用作:

cat input.txt | python -c 'import sys; print "".join(l for l in sys.stdin.readlines() if l.strip()),' > output.txt

【讨论】:

    【解决方案6】:

    如果你想处理大文件而不用担心内存不足的错误,你应该循环执行:

    import sys
    
    for line in sys.stdin:
        if line[:-1]:
            sys.stdout.write(line)
    

    如果必须有一行代码,下面是一行相同的代码:

    for _ in (sys.stdout.write(line) for line in sys.stdin if line[:-1]): pass
    

    已编辑以包含 agf 的提示。

    【讨论】:

    • 如果你这样做for Null in (sys.stdout.write(line) for line in sys.stdin if line.strip()): pass,你就没有保存Nones(除了一个,反正)
    • 感谢您的提示。我忘记了您不必在冒号后添加换行符。我修改了我的例子。顺便说一句,line.strip() 将跳过仅包含空格的非空行。
    • 我知道,但它们符合我对“空”的定义。
    • “[...for...in...]”而不是“for _ in (...for...in...): pass”
    【解决方案7】:
    os.system("grep -v '^$' file_name > file_name")
    

    【讨论】:

    • @Jakob 我不知道这是否毫无意义。 OP 没有解释他为什么需要这种单线。对我来说,这似乎是一个很好的答案。但它不适用于 Windows。
    • 阅读问题 python 等价于 --> grep -v '^$' file_name > file_name 他不想执行 grep 否则他只会使用 cmd 行,os.system 是执行 shell 命令及其的最糟糕的方式不跨平台
    【解决方案8】:

    fileinput 模块具有“就地”选项,用于一次性编辑文件。在读取文件时,标准输出会暂时重定向到输入文件。

    这是一个可以做你想做的事情(在 bash 中完成):

    python -c $'import sys, re, fileinput\nfor line in fileinput.input("file_name", inplace=True): sys.stdout.write( re.sub(r"^\\n$", "", line) )'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-10
      • 2013-10-20
      • 2014-05-24
      • 1970-01-01
      • 2015-10-08
      • 2010-09-08
      • 2012-09-11
      相关资源
      最近更新 更多