Python解析结构化文本文件

时间:2014-07-19 14:37:48

标签: python structured-data

我想在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文件),但是我无法使用它。谷歌和SO引领我走向pyparser,但这更像是在解释句子而我无法弄清楚如何为多行构建模板。我正在寻找像ConfigParser这样的东西,以及它如何处理.ini文件或BeautifulSoup对html / xml文件或lxml对xml文档等的处理。

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

可接受的答案

任何这些都是可以接受的:

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

    这类问题属于哪种编程或数据处理分支?如果您有一些数据,则定义模板或自动定义模板,然后应用它以结构化方式访问数据。

    谢谢!

1 个答案:

答案 0 :(得分: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,我想从source of configparser开始作为参考。具体来说,您可以look at the regexes used