2012-07-30 129 views
0

我有兩個包含大量項目的大型XML文件(c.100MB)。我想輸出他們之間的差異。Python比較XML文件

每個項目都有一個ID,我需要檢查它是否在兩個文件中。如果是,那麼我需要比較該物品的各個值,以確定它是同一物品。

SAX解析器是解決這個問題的最好方法,它是如何使用的?我使用了元素樹,並找到了哪些工作在較小的文件上,但現在我無法處理大文件。

srcTree = ElementTree() 
srcTree.parse(srcFile) 

# finds all the items in both files 
srcComponents = (srcTree.find('source')).find('items') 
srcItems = srcComponents.findall('item') 
dstComponents = (dstTree.find('source')).find('items') 
dstItems = dstComponents.findall('item') 

# parses the source file to find the values of various fields of each 
# item and adds the information to the source set 
for item in srcItems: 
    srcId = item.get('id') 
    srcList = [srcId] 
    details = item.find('values') 
    srcVariables = details.findall('value') 
    for var in srcVariables: 
    srcList.append((var.get('name'),var.text)) 
srcList = tuple(srcList) 
srcSet.add(srcList) 
+2

向我們展示你寫 – wroniasty 2012-07-30 10:51:58

+0

失敗的代碼它將所有內容加載到內存中,因此它不適用於這些文件。我使用元素樹來獲取每個xml文件中的數據樹。我在樹上使用find來獲取所有項目到列表中。然後,我循環這些項目以獲取每個項目的值並將信息存儲在一組元組中:[(id,val,val),(id,val,val)]。我爲這兩個文件做了這個。找到這些集合的差異,然後將結果存儲在一個文件中。 – charlie123 2012-07-30 10:59:32

回答

2

您可以使用ElementTree,一個拉解析器(如SAX)http://effbot.org/zone/element-pull.htm 以及存在elementree http://effbot.org/zone/element-iterparse.htm 的iterparse功能這兩個都會讓你處理大文件時都加載到內存中。

但薩克斯可以工作(我已經用它處理了比100MB大得多的100MB),但我現在會用elementtree來完成那項工作。

也有基於與LXML(etree兼容)http://lxml.de/tutorial.html#event-driven-parsing

這裏是使用iterparse與文件的好文章解析一下增量/事件> 1GB http://www.ibm.com/developerworks/xml/library/x-hiperfparse/