【问题标题】:How to delete all blank lines in the file with the help of python?如何在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 上运行。

标签: python text-processing


【解决方案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 :)
          猜你喜欢
          • 2021-02-28
          • 2019-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-22
          • 2017-05-13
          相关资源
          最近更新 更多