Python 解析结构化文本文件

1 投票
1 回答
2100 浏览
提问于 2025-04-18 13:57

我想用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()

输出结果

[]

我出错的地方在于没有一个叫'test'的文件,这真是个低级错误。

背景

在发帖之前,我尝试过使用ConfigParser(因为我很久以前用过它处理.ini文件),但我没能让它工作。谷歌和StackOverflow把我引导到了pyparser,但那个似乎更适合解析句子,我也搞不清楚如何为多行结构定义模板。我在寻找类似ConfigParser的东西,它处理.ini文件的方式,或者BeautifulSoup处理html/xml文档的方式,或者lxml处理xml文档的方式等等。

不幸的是,我不知道这属于编程或数据处理的哪个领域,也不知道该用什么关键词来找到解决方案。出于沮丧,我在这里发了个问题。

可接受的答案

以下任意一种答案都是可以接受的:

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

额外加分

这种问题属于编程或数据处理的哪个领域?也就是说,当你有一些数据时,你定义一个模板,或者模板自动定义,然后用它以结构化的方式访问数据。

谢谢!

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 的源代码,作为参考。特别是,你可以 查看里面用到的正则表达式

撰写回答