如何在python的帮助下删除文件中的所有空行?

Posted

技术标签:

【中文标题】如何在python的帮助下删除文件中的所有空行?【英文标题】:How to delete all blank lines in the file with the help of python? 【发布时间】:2011-01-23 02:09:12 【问题描述】:

例如,我们有一些这样的文件:

first line
second line

third line

结果我们必须得到:

first line
second line
third line

只使用 python

【问题讨论】:

分享您的想法和尝试。我们会尽力帮助您。 用 grep 实际上很简单,例如。 grep -v '^$' file 它应该在win和linux下都可以工作,所以我们只能使用python,没有grep =) grep 也可以在 windows 上运行。 答案在:codereview.stackexchange.com/questions/145126/… 【参考方案1】:

with 语句非常适合自动打开和关闭文件。

with open('myfile','rw') as file:
    for line in file:
        if not line.isspace():
            file.write(line)

【讨论】:

+1 用于使用 "with" 和好的 Pythonic 迭代行,除了不改变好的输出行。 根据docs.python.org/2/tutorial/…,看来您必须使用r+ 标志而不是rw 打开myfile 此解决方案似乎对于任何大于输入缓冲区大小的文件都会出现缓冲/覆盖问题。如果没有,有人可以解释原因吗? 除了删除文本文件中数据之间已经存在的空白行之外,这对所有内容都适用。 Python 3: ValueError: 必须恰好具有创建/读取/写入/追加模式之一。这个解决方案真的有效吗?【参考方案2】:
import fileinput
for line in fileinput.FileInput("file",inplace=1):
    if line.rstrip():
        print line

【讨论】:

+1 用于捕获包含空格的行。 这将改变空格的格式,即使在好的行中 Markdown 格式使用尾随空格。删除对此答案的简单更改将仅使用空格去除行并保留尾随空格:if line.rstrip(): print line @Thomas,为什么文件中的字段会以“\n”结尾?如果一个文件有“\n”,那么我敢打赌它的字面意思。如果它真的是“\n”,那么下一个字段将在下一行。不是这样吗?还是我仍然想念你在说什么?如果它必须提供您的解释作为答案,因为评论很难阅读。 @ghostdog74 这不是关于换行符,而是关于标签。如果从每一行的末尾剪切制表符,那么表格中的每一行将不会有相同的列数。【参考方案3】:
import sys
with open("file.txt") as f:
    for line in f:
        if not line.isspace():
            sys.stdout.write(line)

另一种方法是

with open("file.txt") as f:
    print "".join(line for line in f if not line.isspace())

【讨论】:

【参考方案4】:

我知道您询问过 Python,但您对 Win 和 Linux 的评论表明您追求跨平台性,而 Perl 至少与 Python 一样跨平台。您可以在命令行中使用一行 Perl 轻松完成此操作,无需脚本:perl -ne 'print if /\S/' foo.txt

(我喜欢 Python 并且 99% 的时间都喜欢它而不是 Perl,但有时我真的希望我可以像使用 -e 切换到 Perl 一样使用它来编写命令行脚本!)

也就是说,下面的 Python 脚本应该可以工作。如果您希望经常这样做或对大文件执行此操作,则也应通过编译正则表达式对其进行优化。

#!/usr/bin/python
import re
file = open('foo.txt', 'r')
for line in file.readlines():
    if re.search('\S', line): print line,
file.close()

有很多方法可以做到这一点,这只是一种:)

【讨论】:

您可以使用-c 标志使用python 执行命令行脚本。不幸的是,您必须使用多行(或用 ; 分隔)才能从标准输入中读取。【参考方案5】:
with open(fname, 'r+') as fd:
    lines = fd.readlines()
    fd.seek(0)
    fd.writelines(line for line in lines if line.strip())
    fd.truncate()

【讨论】:

【参考方案6】:
>>> s = """first line
... second line
... 
... third line
... """
>>> print '\n'.join([i for i in s.split('\n') if len(i) > 0])
first line
second line
third line
>>> 

【讨论】:

这取决于“空白”的含义——这仅在空白意味着“什么都没有”时才有效。如果第二行和第三行之间有空格,这将失败。另外它需要处理文件:)但我喜欢你不必导入正则表达式:) @Chirael - 在这种情况下,您可以只添加 len(i.strip()) > 0【参考方案7】:

你试过类似下面的程序吗?

for line in open(filename):
    if len(line) > 1 or line != '\n':
        print(line, end='')

【讨论】:

【参考方案8】:

您可以使用以下方式删除所有空行:

with open("new_file","r") as f:
 for i in f.readlines():
       if not i.strip():
           continue
       if i:
           print i,

我们也可以使用以下方式将输出写入文件:

with open("new_file","r") as f, open("outfile.txt","w") as outfile:
 for i in f.readlines():
       if not i.strip():
           continue
       if i:
           outfile.write(i)            

【讨论】:

【参考方案9】:

说明:在基于 Linux/Windows 的平台上,我们安装了以下解决方案的 shell,因为“os”模块将可用并尝试使用正则表达式

解决方案:

import os
os.system("sed -i \'/^$/d\' file.txt")

【讨论】:

1.这忽略了问题的约束(即仅使用 python)和 2. 如果它不是 POSIX 系统怎么办? @Jared Smith 我发布的答案是针对基于 LSB 的系统,它是 POSIX 的超集。 如果您可以在答案中添加更多详细信息/解释,那就太好了。 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。 你基本上没有使用 python :)

以上是关于如何在python的帮助下删除文件中的所有空行?的主要内容,如果未能解决你的问题,请参考以下文章

使用宏删除 VB.NET 代码中的所有注释和空行的 Visual Studio 正则表达式

使用POWERQUERY 怎么总是删不掉这个空值?求帮助使用POWERQUERY 怎么总是删不掉这个空值?求帮助

Bash:如何删除所有带有扩展名的文件上的所有空行[重复]

Pyspark数据框如何删除所有列中的空行?

怎样快速删除Word中的空行

怎样删除文档中的空行?