Python解析xml大文件(sax)
admin
2023-07-31 00:37:19
0
使用到的包:xml.sax 文档

代码托管位置 github-pytools

需求

读取xml数据文件,文件较大,需要实时处理插入到数据库

xml文档

12345678910111213141516 <PERSONS><person>    <id>100000</id>    <sex></sex>    <address>北京,海淀区</address>    <fansNum>437</fansNum>    <summary>1989</summary>    <wbNum>333</wbNum>    <gzNum>242</gzNum>    <blog>null</blog>    <edu>大学</edu>    <work></work>    <renZh>1</renZh>    <brithday>214</brithday></person></PERSONS>

处理

sax处理时并不会像dom一样可以以类似节点的维度进行读取,它只有 开始标签 内容 结束标签 之分

处理思想是:通过一个handler,对开始标签,内容,结束标签各有一个处理函数

代码及注解

person 处理类

123456789101112131415161718192021222324252627282930313233 from xml.sax import handler,parseStringclass PersonHandler(handler.ContentHandler):  def __init__(self, db_ops):    #db op obj    self.db_ops = db_ops    #存储一个person的map    self.person = {}    #当前的tag    self.current_tag = \”\”    #是否是tag之间的内容 ,目的拿到tag间内容,不受空白的干扰    self.in_quote = 0  #开始,清空map  def startElement(self, name, attr):    #以person,清空map    if name == \”person\”:      self.person = {}    #记录 状态    self.current_tag = name    self.in_quote = 1  #结束,插入数据库  def endElement(self, name):    #以person结尾  代表读取一个person的信息结束    if name == \”person\”:      #do something      in_fields = tuple([ (\’\”\’ + self.person.get(i,\”\”) + \’\”\’)  for i in fields ])      print in_sql % in_fields      db_ops.insert( in_sql%(in_fields))    #处理    self.in_quote = 0  def characters(self, content):    #若是在tag之间的内容,更新到map中    if self.in_quote:      self.person.update({self.current_tag: content})

加上入库的完整代码

1234567891011և件,文件较大,需要实时处理插入到数据库

xml文档

12345678910111213141516 <PERSONS><person>    <id>100000</id>    <sex></sex>    <address>北京,海淀区</address>    <fansNum>437</fansNum>    <summary>1989</summary>    <wbNum>333</wbNum>    <gzNum>242</gzNum>    <blog>null</blog>    <edu>大学</edu>    <work></work>    <renZh>1</renZh>    <brithday>214</brithday></person></PERSONS>

处理

sax处理时并不会像dom一样可以以类似节点的维度进行读取,它只有 开始标签 内容 结束标签 之分

处理思想是:通过一个handler,对开始标签,内容,结束标签各有一个处理函数

代码及注解

person 处理类

123456789101112131415161718192021222324252627282930313233 from xml.sax import handler,parseStringclass PersonHandler(handler.ContentHandler):  def __init__(self, db_ops):    #db op obj    self.db_ops = db_ops    #存储一个person的map    self.person = {}    #当前的tag    self.current_tag = \”\”    #是否是tag之间的内容 ,目的拿到tag间内容,不受空白的干扰    self.in_quote = 0  #开始,清空map  def startElement(self, name, attr):    #以person,清空map    if name == \”person\”:      self.person = {}    #记录 状态    self.current_tag = name    self.in_quote = 1  #结束,插入数据库  def endElement(self, name):    #以person结尾  代表读取一个person的信息结束    if name == \”person\”:      #do something      in_fields = tuple([ (\’\”\’ + self.person.get(i,\”\”) + \’\”\’)  for i in fields ])      print in_sql % in_fields      db_ops.insert( in_sql%(in_fields))    #处理    self.in_quote = 0  def characters(self, content):    #若是在tag之间的内容,更新到map中    if self.in_quote:      self.person.update({self.current_tag: content})

加上入库的完整代码

1234567891011riped-num\” data-line=\”crayon-5812b35671ddf144155901-12\”>12

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...