1. 程式人生 > >第三章——供機器讀取的數據(XML)

第三章——供機器讀取的數據(XML)

t對象 有一個 back 兩個 代碼 highlight github attr logs

本書使用的文件、代碼: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)