Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在捕获数据之前,已清除iterparse元素_Python_Python 3.x_Celementtree_Iterparse - Fatal编程技术网

Python 在捕获数据之前,已清除iterparse元素

Python 在捕获数据之前,已清除iterparse元素,python,python-3.x,celementtree,iterparse,Python,Python 3.x,Celementtree,Iterparse,我正在尝试使用Python,使用cElementTree和iterparse解析一个大型XML文件(27GB)。我能够提取所有标记,但由于某种原因,没有检索到任何元素文本(它总是显示“无”)。我已经检查了文档和StackOverflow,但没有结果。作为最后一种手段,我尝试了使用lxml进行解析,结果很有效,但如果可能的话,我更愿意在cElementree上解决这个问题。 更新:当我注释掉elem.clear()行时,它显示了正在解析的数据,但现在我试图弄清楚为什么clear()方法在打印数据之

我正在尝试使用Python,使用cElementTree和iterparse解析一个大型XML文件(27GB)。我能够提取所有标记,但由于某种原因,没有检索到任何元素文本(它总是显示“无”)。我已经检查了文档和StackOverflow,但没有结果。作为最后一种手段,我尝试了使用lxml进行解析,结果很有效,但如果可能的话,我更愿意在cElementree上解决这个问题。 更新:当我注释掉elem.clear()行时,它显示了正在解析的数据,但现在我试图弄清楚为什么clear()方法在打印数据之前会擦除数据(最终我想将数据放入一个单独的数据结构,如数据库)。我假设我需要清除数据,这样我就不会在文件解析过程中耗尽内存。这是那种“Python中的一切都是对象”的情况吗

使用从文件中提取的较小样本,我仍然会得到相同的错误。XML文件看起来像这样(尽管有更多的条目):

我要走了

fragmentId {} None
aggregateId {} None
source {} None
sourceName {} None
sourceOid {} None
sourceAaoid {} None

为什么elem.clear()会擦除文本,即使看起来应该先打印?有什么建议吗?

以下是我将如何做的,我也不确定您希望如何处理这些数据 所以我只是像你一样打印它:

import xml.etree.ElementTree as ET

tree = ET.parse(path_to_xml)
root = tree.getroot()

def tree_parser(root):
    for child in root.getchildren():
        if not child.getchildren():
            print(child.tag, child.text)
        else:
            tree_parser(child)

tree_parser(root) 

fragmentId d68e616e-a6bc-4630-b104-3891859a8ce4
aggregateId H1060734453
source b6167864-5f74-40e5-97c5-7e551a3a4a7d
sourceName SHM ADT
sourceOid 2.16.840.1.113883.3.2.2.3.1.21.3
sourceAaoid 2.16.840.1.113883.3.62.2
根据你的评论:

def tree_parser(root, seen=set()):
    for child in root.getchildren():
        if not child.getchildren():
            data = (child.tag, child.text)
            seen.add(data)
        else:
            tree_parser(child, seen)
    return seen

for _, element in etree.iterparse(path_to_xml):
    c = tree_parser(element)

print(c)

{('aggregateId', 'H1060734453'),
 ('fragmentId', 'd68e616e-a6bc-4630-b104-3891859a8ce4'),
 ('source', 'b6167864-5f74-40e5-97c5-7e551a3a4a7d'),
 ('sourceAaoid', '2.16.840.1.113883.3.62.2'),
 ('sourceName', 'SHM ADT'),
 ('sourceOid', '2.16.840.1.113883.3.2.2.3.1.21.3')}
elem.clear()
移动到
下的块,如果elem.tag==“entity”:
语句有效。这样可以确保仅在处理子元素后才清除它们

count = 0

for event, elem in etree.iterparse(xml):
    if event == 'end':
        if elem.tag == 'entity':
            count+=1        
            for child in elem:
                print (child.tag, child.attrib, child.text)
            elem.clear()    # Clear only if </entity> is encountered
print(count)
count=0
对于事件,etree.iterparse(xml)中的元素:
如果事件==“结束”:
如果elem.tag==“实体”:
计数+=1
对于elem中的儿童:
打印(child.tag、child.attrib、child.text)
元素清除()#仅当遇到
打印(计数)
在原始示例中,当遇到
结束标记时,所有子元素都已清除(它们的结束标记在前面遇到)

count=0
对于事件,etree.iterparse(xml)中的元素:
如果事件==“结束”:
如果elem.tag==“实体”:
计数+=1
对于elem中的儿童:
打印(child.tag、child.attrib、child.text)
元素清除()#清除碎片ID。。。以前的源代码
打印(计数)

你能用iterparse和elem.clear()实现这一点吗?我的内存不足,无法先将整个文件存入内存。谢谢
def tree_parser(root, seen=set()):
    for child in root.getchildren():
        if not child.getchildren():
            data = (child.tag, child.text)
            seen.add(data)
        else:
            tree_parser(child, seen)
    return seen

for _, element in etree.iterparse(path_to_xml):
    c = tree_parser(element)

print(c)

{('aggregateId', 'H1060734453'),
 ('fragmentId', 'd68e616e-a6bc-4630-b104-3891859a8ce4'),
 ('source', 'b6167864-5f74-40e5-97c5-7e551a3a4a7d'),
 ('sourceAaoid', '2.16.840.1.113883.3.62.2'),
 ('sourceName', 'SHM ADT'),
 ('sourceOid', '2.16.840.1.113883.3.2.2.3.1.21.3')}
count = 0

for event, elem in etree.iterparse(xml):
    if event == 'end':
        if elem.tag == 'entity':
            count+=1        
            for child in elem:
                print (child.tag, child.attrib, child.text)
            elem.clear()    # Clear only if </entity> is encountered
print(count)
count = 0

for event, elem in etree.iterparse(xml):
    if event == 'end':
        if elem.tag == 'entity':
            count+=1        
                for child in elem:
                    print (child.tag, child.attrib, child.text)
    elem.clear()    # Clears fragmentId ... sourceAaoid before </entity>
print(count)