python基礎總結(xml以及json)
目錄
1、XML速成
XML 是一種描述層次結構化數據的通用方法。XML 文檔包含由起始和結束標籤(tag)分隔的一個或多個元素(element)。以下也是一個完整的(雖然空洞)XML 文件:
<foo> ①
</foo> ②
- 這是 foo 元素的起始標籤。
- 這是 foo 元素對應的結束標籤。就如寫作、數學或者代碼中需要平衡括號一樣,每一個起始標籤必須有對應的結束標籤來閉合(匹配)。
元素可以嵌套到任意層次。位於 foo 中的元素 bar 可以被稱作其子元素。
<foo>
<bar></bar>
</foo>
元素可以有其屬性(attribute),它們是一些名字‐值(name‐value)對。屬性由空格分隔列舉在元素的起始標籤中。一個元素中屬性名不能重複。屬性值必須用引號包圍起來。單引號、雙引號都是可以。
<foo lang='en'> ①
<bar id='papayawhip' lang="fr"></bar> ②
</foo>
- foo 元素有一個叫做 lang 的屬性。lang 的值爲 en
- bar 元素則有兩個屬性,分別爲 id 和 lang。其中 lang 屬性的值爲 fr。它不會與 foo 的那個屬性產生衝突。每個元素都其獨立的屬性集。
2、解析XML
Python可以使用幾種不同的方式解析XML文檔。它包含了DO和SAX解析器,但是我們焦點將放在另外一個叫做ElementTree的庫上邊。
>>> import xml.etree.ElementTree as etree ①
>>> tree = etree.parse('examples/feed.xml') ②
>>> root = tree.getroot() ③
>>> root ④
<Element {http://www.w3.org/2005/Atom}feed at cd1eb0>
- ElementTree 屬於 Python 標準庫的一部分,它的位置爲
xml.etree.ElementTree。 - parse()函數是ElementTree庫的主要入口,它使用文件名或者流對象作爲參數。parse()函數會立即解析完整個文檔。如果內存資源緊張,也可以增量式地解析XML文檔
- parse()函數會返回一個能代表整篇文檔的對象。這不是根元素。要獲得根元素的引用可以調用 getroot()方法。
- 如預期的那樣,根元素即 http://www.w3.org/2005/Atom 名字空間中的 feed。該字符串表示再次重申了非常重要的一點:XML 元素由名字空間和標籤名(也稱作本地名(local name))組成。這篇文檔中的每個元素都在名字空間 Atom 中,所以根元素被表示{http://www.w3.org/2005/Atom}feed。
注意:ElementTree 使用{namespace}localname 來表達 XML 元素。
3、元素即列表
在 ElementTree API 中,元素的行爲就像列表一樣。列表中的項即該元素的子元素。
4、屬性即字典
XML 不只是元素的集合;每一個元素還有其屬性集。一旦獲取了某個元素的引用,我們可以像操作 Python 的字典一樣輕鬆獲取到其屬性。
5、序列化PYTHON對象
序列化的概念很簡單。內存裏面有一個數據結構,你希望將它保存下來,重用,或者發送給其他人。你會怎麼做?嗯, 這取決於你想要怎麼保存,怎麼重用,發送給誰。很多遊戲允許你在退出的時候保存進度,然後你再次啓動的時候回到上次退出的地方。(實際上, 很多非遊戲程序也會這麼幹。) 在這個情況下,一個捕獲了當前進度的數據結構需要在你退出的時候保存到磁盤上,接着在你重新啓動的時候從磁盤上加載進來。這個數據
只會被創建它的程序使用,不會發送到網絡上,也不會被其它程序讀取。因此,互操作的問題被限制在保證新版本的程序能夠讀取以前版本的程序創建的數據。
在這種情況下,pickle 模塊是理想的。它是 Python 標準庫的一部分, 所以它總是可用的。它很快; 它的大部分同 Python 解釋器本身一樣是用 C 寫的。 它可以存儲任意複雜的 Python 數據結構。
pickle協議已經存在好多年了,它隨着Python本身的成熟也不斷
成熟。現在存在四個不同版本 的pickle協議。
• Python 1.x 有兩個 pickle 協議,一個基於文本的格式(“版本 0”)以及一個二進制格式(“版本 1”).
• Python 2.3 引入了一個新的 pickle 協議(“版本 2”) 來處理Python 類對象的新功能。它是一個二進制格式。
• Python 3.0 引入了另一個 pickle 協議 (“版本 3”) ,顯式的支持bytes 對象和字節數組。它是一個二進制格式。
6、JSON與pickle區別
pickle模塊使用的數據格式是Python特定的。它沒有做任何兼容其它編程語言的努力。JSON “JavaScript Object Notation” 是跨語言兼容的。
Python 3 在標準庫中包含了一個 json模塊,json模塊包含一些函數,可以序列化數據結構,保存序列化後的數據至磁盤,從磁盤上讀取序列化後的數據,將數據反序列化成新的Pythone對象。
- JSON數據格式是基於文本的, 不是二進制的
- 所有的JSON值都是大小寫敏感的
- JSON允許在值之間有任意數目的空白(空格, 跳格, 回車,換行)。這意味着 JSON 編碼器可以按它們的喜好添加任意多或任意少的空白。
- JSON 用純文本編碼數據,但是你知道, “不存在純文本這種東西。JSON必須以Unicode 編碼(UTF‐32, UTF‐16, 或者默認的, UTF‐8)方式存儲。
7、將PYTHON數據類型映射到JSON
由於 JSON 不是 Python 特定的,對應到 Python 的數據類型的時候有很多不匹配。有一些僅僅是名字不同,但是有兩個Python 數據類型完全缺少,元組和 & 字節串(bytes)
JSON | Python3 |
---|---|
object | object |
array | list |
string | string |
integer | integer |
real number | float |
true | True |
false | False |
null | None |
所有的 JSON 值都是大小寫敏感的 |
8、從JSON文件加載數據
類似 pickle 模塊,json 模塊有一個 load()函數接受一個流對象,從中讀取 JSON 編碼過的數據, 並且創建該 JSON 數據結構的 Python 對象的鏡像。