在python中解析结构化文本文件

在python中解析结构化文本文件,第1张

概述我需要使用 Python解析类似于下面的文本文件,构建数据的分层对象结构,然后处理它.这与我们可以使用xml.etree.ElementTree和其他XML解析器非常相似. 然而,这些文件的语法不是XML,我想知道实现这样一个解析器的最佳方法是什么:如果尝试子类化一个XML解析器(哪个?)并自定义其行为以进行标记识别,请编写自定义解析器,等等 {NETLIST topblock{VERSION 我需要使用 Python解析类似于下面的文本文件,构建数据的分层对象结构,然后处理它.这与我们可以使用xml.etree.ElementTree和其他XML解析器非常相似.

然而,这些文件的语法不是XML,我想知道实现这样一个解析器的最佳方法是什么:如果尝试子类化一个XML解析器(哪个?)并自定义其行为以进行标记识别,请编写自定义解析器,等等

{NETList topblock{VERSION 2 0 0}{CELL topblock    {PORT gearshift_h vpsf vphreg pwron_h vinp vref_out vcntrl_out gd meas_vref       vb vout meas_vcntrl reset_h vinm }    {INST XI21/Mdummy1=pch_18_mac {TYPE MOS} {PROP n="sctg_inv1x/pch_18_mac" Length=0.152 NFIN=8 }    {PIN vpsf=SRC gs_h=DRN vpsf=GATE vpsf=BulK }}    {INST XI21/Mdummy2=nch_18_mac {TYPE MOS} {PROP n="sctg_inv1x/nch_18_mac" Length=0.152 NFIN=5 }    {PIN gs_h=SRC gd=DRN gd=GATE gd=BulK }}    {INST XI20/Mdummy1=pch_18_mac {TYPE MOS} {PROP n="sctg_inv1x/pch_18_mac" Length=0.152 NFIN=8 }    {PIN vpsf=SRC gs_hn=DRN vpsf=GATE vpsf=BulK }}    {INST XI20/Mdummy2=nch_18_mac {TYPE MOS} {PROP n="sctg_inv1x/nch_18_mac" Length=0.152 NFIN=5 }    {PIN gs_hn=SRC gd=DRN gd=GATE gd=BulK }}    {INST XI19/Mdummy1=pch_18_mac {TYPE MOS} {PROP n="sctg_inv1x/pch_18_mac" Length=0.152 NFIN=8 }    {PIN vpsf=SRC net514=DRN vpsf=GATE vpsf=BulK }}    {INST XI19/Mdummy2=nch_18_mac {TYPE MOS} {PROP n="sctg_inv1x/nch_18_mac" Length=0.152 NFIN=5 }    {PIN net514=SRC gd=DRN gd=GATE gd=BulK }}    {INST XI21/MN0=nch_18_mac {TYPE MOS} {PROP n="sctg_inv1x/nch_18_mac" Length=0.152 NFIN=5 }    {PIN gd=SRC gs_h=DRN gs_hn=GATE gd=BulK }}    {INST XI21/MP0=pch_18_mac {TYPE MOS} {PROP n="sctg_inv1x/pch_18_mac" Length=0.152 NFIN=8 }    {PIN vpsf=SRC gs_h=DRN gs_hn=GATE vpsf=BulK }}    {INST XI20/MN0=nch_18_mac {TYPE MOS} {PROP n="sctg_inv1x/nch_18_mac" Length=0.152 NFIN=5 }...}}
解决方法 其他人在评论中说:使用现有的解析器.如果不存在,请自行滚动,但使用解析器库.这里例如与 Parcon:

from pprint import pprintfrom parcon import (Forward,Significantliteral,Word,Alphanum_chars,Exact,ZeroOrMore,Charnotin,concat,OneOrMore)block = Forward()hyphen = Significantliteral('"')word = Word(Alphanum_chars + '/_.)')value = word | Exact(hyphen + ZeroOrMore(Charnotin('"')) + hyphen)[concat]pair = word + '=' + valueflag = wordattribute = pair | flag | blockhead = wordbody = ZeroOrMore(attribute)block << '{' + head + body  + '}'blocks = OneOrMore(block)with open('<your file name>.txt') as infile:    pprint(blocks.parse_string(infile.read()))

结果:

[('NETList',['topblock',('VERSION',['2','0','0']),('CELL',('PORT',['gearshift_h','vpsf','vphreg','pwron_h','vinp','vref_out','vcntrl_out','gd','meas_vref','vb','vout','meas_vcntrl','reset_h','vinm']),('INST',[('XI21/Mdummy1','pch_18_mac'),('TYPE',['MOS']),('PROP',[('n','"sctg_inv1x/pch_18_mac"'),('Length','0.152'),('NFIN','8')]),('PIN',[('vpsf','SRC'),('gs_h','DRN'),('vpsf','GATE'),'BulK')])]),...
总结

以上是内存溢出为你收集整理的在python中解析结构化文本文件全部内容,希望文章能够帮你解决在python中解析结构化文本文件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1193047.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存