我有一个大型 XML 文件(大约 600 MB),我正在尝试使用带有 iterparse 的 cElementTree 进行解析。第一次尝试这个。
在处理每个产品后,我正在迭代“产品”标签和elem.clear()
-ing。在我的解析中,我有一个函数parse_trips
,它使用 for 循环来解析<trip>
标签中的<trips>
标签(每个产品可能有数百个这些标签,每一个都有数百行长)。
for trip in trips:
dump(trip)
get_date(trip, product)
set_price(trip, product)
但是,当我dump(trips)
看到这些标签被提前截断/关闭而没有抛出任何错误时。解析器似乎达到了内存中 elem 的最大长度,然后就不再持有了。
原始xml:
<trip>
<code>text</code>
<name>text</name>
<image>img.jpg</image>
<date>2014-08-10</date>
<pricing>
</pricing>
<itinerary>
<code>1</code>
<events>
<event>
eventInfo 1
</event>
<event>
eventInfo 2
</event>
<event>
eventInfo 3
</event>
<event>
eventInfo 4
</event>
<event>
eventInfo 5
</event>
<event>
eventInfo 6
</event>
<event>
eventInfo 7
</event>
<event>
eventInfo 8
</event>
</events>
</itinerary>
</trip>
我得到的输出是虽然可能有 6 个这样的组,但当我到达组中的第二次旅行时,dump(trip)
看起来像这样:
<trip>
<code>text</code>
<name>text</name>
<image>img.jpg</image>
<date>2014-08-10</date>
<pricing></pricing>
<itinerary>
<code>1</code>
<events>
<event>
eventInfo 1
</event>
<event>
eventInfo 2
</event>
<event>
eventInfo 3
</event>
</events>
</itinerary>
</trip>
以后的每一次旅行都消失了。我尝试循环并仅增加一个整数i
来计算有多少<trip>
标签,它只到达它截断的第二个标签,然后结束 for 循环。
有没有办法查看/配置iterparse
可以抓取的元素的大小?或者iter
一旦我去旅行以获取所有子节点时再次使用的方法<trips>
?