Python 解析结构化文本文件
我想用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文档的方式等等。
不幸的是,我不知道这属于编程或数据处理的哪个领域,也不知道该用什么关键词来找到解决方案。出于沮丧,我在这里发了个问题。
可接受的答案
以下任意一种答案都是可以接受的:
- 展示如何使用ConfigParser来解决这个问题。
- 或者,如果有其他模块可以解析这种结构化文本文件,请说明并提供一个示例。
额外加分
这种问题属于编程或数据处理的哪个领域?也就是说,当你有一些数据时,你定义一个模板,或者模板自动定义,然后用它以结构化的方式访问数据。
谢谢!
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 的源代码,作为参考。特别是,你可以 查看里面用到的正则表达式。