【问题标题】:How do I clean up empty lines in a configparser file?如何清理 configparser 文件中的空行?
【发布时间】:2017-09-23 02:45:00
【问题描述】:

我有时会在更改和删除值后得到一个如下所示的 .ini 文件:

[Section A]
x = 1
d = 2



[Section B]
a = 3

有没有一种简单的方法可以保持干净并删除部分之间的那些空白行?

【问题讨论】:

    标签: python


    【解决方案1】:

    如果你想使用严格的 python 解决方案,你可以创建一个临时文件,复制非空行,然后替换文件。

    from tempfile import mkstemp
    from os import close
    from shutil import move
    
    def replace(filename, name, new_value):
        fd, path = mkstemp()
        with open(path,'w') as tmpfile:
            with open(filename) as csv:
                for line in cvs:
                    if line.strip()!="":
                        tmpfile.write(line)
        close(fd)
        move(path, filename)
    

    【讨论】:

      【解决方案2】:

      也许这可以工作:

      lines = open("file").readlines()
      
      n_lines = ["%s" % line for line in lines if line.strip()]
      
      f = open("file", "w")
      f.write("".join(n_lines))
      f.close()
      

      我使用列表推导并使用过滤器行创建一个新变量。

      编辑

      如果您可以为每个部分添加换行符,这也许可以工作:

      lines = open("file").readlines()
      
      n_lines = ["\n%s" % line if "[Sect" in line else line for line in lines if line.strip()]
      
      f = open("file", "w")
      f.write("".join(n_lines).lstrip())
      f.close()
      

      编辑 2:

      我不确定……但是

      如果你的文件很大,而你使用的 Python 是 3 版本,也许你可以使用这个代码来获得更好的性能:

      def readfile(filepath): 
          with open(filepath, "r") as f: 
              for line in f:
                  yield line
      
      lines = readfile("file")
      
      n_lines = ["\n%s" % line if "[Sect" in line else line for line in lines if line.strip()]
      
      f = open("file", "w")
      f.write("".join(n_lines).lstrip())
      f.close()
      

      Reference

      【讨论】:

      • 为什么不能没有%: n_lines = [line for line in lines if line.strip()]
      • 是的,您可以在没有% 的情况下获得line 的值
      • 效果很好。如果它在每个部分之后留下一个空白行就完美了,但我可以想象这会更复杂一些。也许如果它将每个“[”替换为“\n[”,除了第一个“[”
      • 我用另一个代码编辑了这个问题,可能可以在每个部分使用换行符......
      • 我删除了.write()lstrip()的第一个换行符,你可以测试代码并确认..
      【解决方案3】:

      使用像grep这样的工具可能更容易

      $ grep -v "^\\s*$" foo > bar
      

      但如果您必须使用 Python,请查看this answer

      【讨论】:

      • configparser 模块不能自己保持 ini 文件的整洁似乎很奇怪。
      • 不是说我有这本事,但是在官方的configparser库中加入这样的功能会有多难?
      • @Dima 看看github.com/python/cpython/blob/3.6/Lib/configparser.py#L904 ... 可能有点工作,但没什么难的。
      • @Dima 你可以分叉它,进行更改并发布合并请求,请参阅akrabat.com/…
      【解决方案4】:

      只需使用 sed:

      sed '/^$/d' myfile.ini

      有效

      【讨论】:

      • 我从未听说过 sed。它是基本 python 库的一部分吗?
      • @Dima:这是一个标准的 Unix 工具,如果你在 Linux 或 OS X 上它默认安装。
      • 要添加到@MatteoItalia 的评论中,如果您想在 Windows 下使用 sed(或 grep),您可以安装 cygwin,它为您提供 Linux shell 和各种有用的 Linux 命令。
      • 我更喜欢只使用 python,因为它看起来并不难编程。我只是想知道 configparser 是否有我缺少的功能。
      • @TimGJ:我个人更喜欢 GnuWin32,它们是 coreutils 和其他东西的本地端口(不像 Cygwin,它实际上提供了完整的 POSIX 仿真层)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 2022-01-17
      • 2019-12-20
      • 2011-09-27
      相关资源
      最近更新 更多