如何在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 正则表达式