第三章——供機器讀取的數據(XML)
阿新 • • 發佈:2017-10-28
t對象 有一個 back 兩個 代碼 highlight github attr logs
機器可讀(machine readable)文件格式: 1、逗號分隔值(Comma-Separated Values, CSV) 2、JavaScript對象符號(JavaScript Object Notation, JSON) 3、可擴展標記語言(eXtensible Markup Language, XML)
本書使用的文件、代碼:https://github.com/huangtao36/data_wrangling
機器可讀(machine readable)文件格式: 1、逗號分隔值(Comma-Separated Values, CSV) 2、JavaScript對象符號(JavaScript Object Notation, JSON) 3、可擴展標記語言(eXtensible Markup Language, XML)
第三章使用的數據文件:
XML數據
XML是一種標記語言,它具有包含格式化數據的文檔結構。本質是也只是格式特殊的數據文件。 要處理的數據樣本(XML基本數據格式):XML中有兩個位置可以保存數據:
1、兩個標簽之間:<Display>71</Display>
2、標簽的屬性:<Dim Category="SEX" Code="BTSX"/>——其中Category的屬性值是“SEX”,Code的屬性值是"BTSX"。
XML的屬性可以保存特定標簽的額外信息,這些標簽又嵌套在另一個標簽中。
實現代碼(基於Python3)
from xml.etree import ElementTree as ET tree = ET.parse(‘data-text.xml‘) root = tree.getroot() #獲取樹的根元素 data = root.find(‘Data‘) all_data = [] for observation in data: record = {} for item in observation: lookup_key_List = list(item.attrib.keys()) lookup_key = lookup_key_List[0] if lookup_key == ‘Numeric‘: rec_key = ‘NUMERIC‘ rec_value = item.attrib[‘Numeric‘] else: rec_key = item.attrib[lookup_key] rec_value = item.attrib[‘Code‘] record[rec_key] = rec_value all_data.append(record) print (all_data)
輸出(部分):
(輸出的是單行數據,為了直觀,這裏進行了處理。)
代碼解釋
from xml.etree import ElementTree as ET
本例中使用的是ElementTree、還可以使用lxml、minidom這兩種庫來解析XML文件,在此不做說明
獲取Data元素中的內容
由上面的樣本可知,我們使用的數據是包含在一個<Data>...</Data>中的,這裏使用根元素的find方法可以利用標簽名來搜索子元素。
from xml.etree import ElementTree as ET tree = ET.parse(‘data-text.xml‘) root = tree.getroot() #獲取樹的根元素 data = root.find(‘Data‘)print (list(data))
輸出:
輸出的是一個列表,元素是<Observation> ........</Observation>標簽裏面的內容 我們的數據文件只有一個Data標簽,如果有多個Data標簽,可以將find函數改為findall函數來遍歷。第三章——供機器讀取的數據(XML)