1

我想在 python 中解析格式的结构化文本文件:

[filter name_of_filter]
field1 = xxx, xxx
field2 = 23

文本文件可能包含具有不同数量字段的其他标题。对我来说,该结构类似于 Windows ini 文件。我希望以与 ConfigParser 提供访问权限相同的方式访问数据,即能够列出部分,然后对于给定的部分,查看字段及其对应的值是什么。目的是读取文件,修改它的位并以相同的格式写回。

原始代码

import ConfigParser as cp

config = cp.ConfigParser()
config.read('test')

print config.sections()

输出

[]

我出错的地方是不存在名为“测试”的文件,这是我的蹩脚错误。

背景

在发布之前,我尝试了 ConfigParser(因为很久以前我曾在 .ini 文件中使用过它)但我无法让它工作。Google 和 SO 引导我使用 pyparser,但这似乎更多地用于解释句子,我无法弄清楚如何为多行构建模板。我一直在寻找类似 ConfigParser 以及它如何处理 .ini 文件或 BeautifulSoup 处理 html/xml 文档或 lxml 处理 xml 文档等的东西。

不幸的是,我不知道这属于编程/数据处理的哪个分支,也不知道使用正确的关键字来确定自己的解决方案。在我的沮丧中,我在这里发布了一个问题。

可接受的答案

以下任何一项都是可以接受的:

  1. 展示如何使用 ConfigParser 来解决问题。
  2. 或者,如果有另一个模块可以解释这种类型的结构化文本文件,请说明并提供示例。

奖励积分

这类问题属于编程或数据处理的哪个分支?在您有一些数据的地方,您定义一个模板或自动定义一个模板,然后将其应用于以结构化方式访问数据。

谢谢!

4

1 回答 1

4

您当然可以使用ConfigParser处理您的示例:

>>> txt='''\
... [filter name_of_filter]
... field1 = xxx, xxx
... field2 = 23'''
>>> import io
>>> import ConfigParser
>>> config = ConfigParser.RawConfigParser(allow_no_value=True)
>>> config.readfp(io.BytesIO(txt))
>>> config.items("filter name_of_filter")
[('field1', 'xxx, xxx'), ('field2', '23')]

有一个文件:

config = ConfigParser.RawConfigParser(allow_no_value=True)
with open(fn) as fin:
    config.readfp(fin)
    for section in config.sections():
        print '"{}":\t{}'.format(section, config.items(section))

# "filter name_of_filter":  [('field1', 'xxx, xxx'), ('field2', '23')]

如果你想要configparser 这样的功能而不使用configparser,我想从configparser 的源代码开始作为参考。具体来说,您可以查看使用的正则表达式

于 2014-07-19T15:31:54.787 回答