我正在嘗試從幾個 1,000 個 XML 檔案中提取資料并從中組成一個 df。
到目前為止,我的代碼用于單個 XML 提取。
from lxml import etree
import pandas as pd
serial = ["S1.xml"]
content = serial.encode('utf-8')
doc = etree.XML(content)
targets = doc.xpath('/reiXmlPrenos')
data = []
for target in targets:
data.append(target.xpath("./@A")[0])
data.append(target.xpath("./@z")[0])
columns = ['A', 'Z']
pd.DataFrame([data],columns=columns)
XML 檔案如下所示:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<reiXmlPrenos>
<Qf>255340</Qf>
<Qp>597451</Qp>
<CO2>126660</CO2>
<A>2362.8</A>
<Ht>0.336</Ht>
<f0>0.59</f0>
<z>0.105891</z>
</reiXmlPrenos>
對于最終的 df,我希望它看起來像這樣:
A z
S1.xml 2362 0.105891
S2.xml ... ...
...
我得到的錯誤是
line 16, in <module>
content = serial.encode('utf-8')
AttributeError: 'list' object has no attribute 'encode'
你能找到我正在做的錯誤,然后擴展代碼,以便它可以將所有 xml 檔案加載到同一個檔案夾中嗎?
uj5u.com熱心網友回復:
from lxml import etree
import pandas as pd
serial = ["tmp.xml", "S2.xml"]
columns = ["file",'A', 'Z']
all_data = []
for item in serial:
data = []
data.append(item)
with open(item, 'r') as file:
content = file.read().encode('utf-8')
doc = etree.XML(content)
# add a predicate to make sure A and z exists
targets = doc.xpath('/reiXmlPrenos[A and z]')
for target in targets:
data.append(target.xpath("./A")[0].text)
data.append(target.xpath("./z")[0].text)
all_data.append(data)
df = pd.DataFrame(all_data,columns=columns)
print(df)
結果
file A Z
0 tmp.xml 2362.8 0.105891
1 S2.xml 2362.8 0.105891
uj5u.com熱心網友回復:
僅使用 Pandas(引擎蓋下的 lxml):
import pandas as pd
# file S1 same as S2, for demonstration
serial = ["S1.xml", "S2.xml"]
# To save money, we first collect dataframes in the generator, then combine them.
df = pd.concat((pd.read_xml(file, xpath='//reiXmlPrenos')[['A', 'z']] for file in serial))
# Adding a column for indexing.
df['serial'] = serial
df = df.set_index('serial')
print(df)
A z
serial
S1.xml 2362.8 0.105891
S2.xml 2362.8 0.105891
uj5u.com熱心網友回復:
要使用 lxml 從 XML 檔案匯入資料,只需創建一個 lxml.etree.ElementTree 實體,并將 XML 檔案的檔案名傳遞給它。資料將被自動決議并存盤在實體中:
tree = lxml.etree.ElementTree(file='myfile.xml')
要訪問資料,只需使用實體的方法和屬性。例如,要獲取 XML 檔案的根元素,請使用 getroot() 方法:
root = tree.getroot()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/521257.html
標籤:Python熊猫xmlxml 解析
