SlideShare a Scribd company logo
Submit Search
Upload
資料永續與交換
Report
Share
Justin Lin
Technology / Community Evangelist at Free lancer
Follow
•
1 like
•
519 views
1
of
72
資料永續與交換
•
1 like
•
519 views
Report
Share
Download Now
Download to read offline
Technology
使用 pickle 與 shelve 認識 DB-API 2.0 使用 sqlite3 模組 處理 CSV、JSON、XML
Read more
Justin Lin
Technology / Community Evangelist at Free lancer
Follow
Recommended
從模組到類別 by
從模組到類別
Justin Lin
500 views
•
63 slides
5. 從模組到類別 by
5. 從模組到類別
Justin Lin
169 views
•
63 slides
10. 資料永續與交換 by
10. 資料永續與交換
Justin Lin
156 views
•
70 slides
11. DOM、事件與樣式 by
11. DOM、事件與樣式
Justin Lin
408 views
•
125 slides
5. 建構式、原型與類別 by
5. 建構式、原型與類別
Justin Lin
205 views
•
61 slides
物件封裝 by
物件封裝
Justin Lin
1.1K views
•
74 slides
More Related Content
What's hot
從模組到類別 by
從模組到類別
Justin Lin
1.7K views
•
62 slides
9. meta-programming by
9. meta-programming
Justin Lin
363 views
•
58 slides
14. 進階主題 by
14. 進階主題
Justin Lin
406 views
•
86 slides
進階主題 by
進階主題
Justin Lin
3K views
•
61 slides
進階主題 by
進階主題
Justin Lin
715 views
•
77 slides
型態與運算子 by
型態與運算子
Justin Lin
1.8K views
•
69 slides
What's hot
(20)
從模組到類別 by Justin Lin
從模組到類別
Justin Lin
•
1.7K views
9. meta-programming by Justin Lin
9. meta-programming
Justin Lin
•
363 views
14. 進階主題 by Justin Lin
14. 進階主題
Justin Lin
•
406 views
進階主題 by Justin Lin
進階主題
Justin Lin
•
3K views
進階主題 by Justin Lin
進階主題
Justin Lin
•
715 views
型態與運算子 by Justin Lin
型態與運算子
Justin Lin
•
1.8K views
4. 使用物件 by Justin Lin
4. 使用物件
Justin Lin
•
174 views
Java SE 8 技術手冊第 5 章 - 物件封裝 by Justin Lin
Java SE 8 技術手冊第 5 章 - 物件封裝
Justin Lin
•
3.4K views
反射與類別載入器 by Justin Lin
反射與類別載入器
Justin Lin
•
562 views
資料永續與交換 by Justin Lin
資料永續與交換
Justin Lin
•
1.8K views
CH04:認識物件 by Justin Lin
CH04:認識物件
Justin Lin
•
421 views
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2 by Justin Lin
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2
Justin Lin
•
5.6K views
Ch07 使用 JSTL by Justin Lin
Ch07 使用 JSTL
Justin Lin
•
161 views
9. 資料結構 by Justin Lin
9. 資料結構
Justin Lin
•
292 views
認識物件 by Justin Lin
認識物件
Justin Lin
•
1.1K views
Java SE 8 技術手冊第 10 章 - 輸入輸出 by Justin Lin
Java SE 8 技術手冊第 10 章 - 輸入輸出
Justin Lin
•
2.6K views
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API by Justin Lin
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Justin Lin
•
3.1K views
型態與運算子 by Justin Lin
型態與運算子
Justin Lin
•
702 views
CH09:Collection與Map by Justin Lin
CH09:Collection與Map
Justin Lin
•
288 views
CH10:輸入輸出 by Justin Lin
CH10:輸入輸出
Justin Lin
•
253 views
Similar to 資料永續與交換
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫 by
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Justin Lin
2.1K views
•
100 slides
Php study.20130110 by
Php study.20130110
bngoogle
771 views
•
18 slides
Ch03 請求與回應 by
Ch03 請求與回應
Justin Lin
236 views
•
73 slides
Ch09 整合資料庫 by
Ch09 整合資料庫
Justin Lin
233 views
•
92 slides
Chapter 4 models by
Chapter 4 models
Ekman Hsieh
152 views
•
26 slides
開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 2018 by
開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 2018
Will Huang
11.8K views
•
36 slides
Similar to 資料永續與交換
(8)
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫 by Justin Lin
Java SE 7 技術手冊投影片第 14 章 - 整合資料庫
Justin Lin
•
2.1K views
Php study.20130110 by bngoogle
Php study.20130110
bngoogle
•
771 views
Ch03 請求與回應 by Justin Lin
Ch03 請求與回應
Justin Lin
•
236 views
Ch09 整合資料庫 by Justin Lin
Ch09 整合資料庫
Justin Lin
•
233 views
Chapter 4 models by Ekman Hsieh
Chapter 4 models
Ekman Hsieh
•
152 views
開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 2018 by Will Huang
開發人員必須知道的 Kubernetes 核心技術 - Kubernetes Summit 2018
Will Huang
•
11.8K views
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509 by tidesq
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509
tidesq
•
2.5K views
Mysql Replication by liufabin 66688
Mysql Replication
liufabin 66688
•
925 views
More from Justin Lin
Ch14 簡介 Spring Boot by
Ch14 簡介 Spring Boot
Justin Lin
872 views
•
22 slides
Ch13 整合 Spring MVC/Security by
Ch13 整合 Spring MVC/Security
Justin Lin
280 views
•
58 slides
Ch12 Spring 起步走 by
Ch12 Spring 起步走
Justin Lin
274 views
•
31 slides
Ch11 簡介 JavaMail by
Ch11 簡介 JavaMail
Justin Lin
157 views
•
8 slides
Ch10 Web 容器安全管理 by
Ch10 Web 容器安全管理
Justin Lin
153 views
•
30 slides
Ch08 自訂標籤 by
Ch08 自訂標籤
Justin Lin
133 views
•
54 slides
More from Justin Lin
(20)
Ch14 簡介 Spring Boot by Justin Lin
Ch14 簡介 Spring Boot
Justin Lin
•
872 views
Ch13 整合 Spring MVC/Security by Justin Lin
Ch13 整合 Spring MVC/Security
Justin Lin
•
280 views
Ch12 Spring 起步走 by Justin Lin
Ch12 Spring 起步走
Justin Lin
•
274 views
Ch11 簡介 JavaMail by Justin Lin
Ch11 簡介 JavaMail
Justin Lin
•
157 views
Ch10 Web 容器安全管理 by Justin Lin
Ch10 Web 容器安全管理
Justin Lin
•
153 views
Ch08 自訂標籤 by Justin Lin
Ch08 自訂標籤
Justin Lin
•
133 views
Ch06 使用 JSP by Justin Lin
Ch06 使用 JSP
Justin Lin
•
250 views
Ch05 Servlet 進階 API、過濾器與傾聽器 by Justin Lin
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
•
204 views
Ch04 會話管理 by Justin Lin
Ch04 會話管理
Justin Lin
•
238 views
Ch02 撰寫與設定 Servlet by Justin Lin
Ch02 撰寫與設定 Servlet
Justin Lin
•
352 views
CH1. 簡介 Web 應用程式 by Justin Lin
CH1. 簡介 Web 應用程式
Justin Lin
•
1.2K views
13.並行、平行與非同步 by Justin Lin
13.並行、平行與非同步
Justin Lin
•
238 views
12. 除錯、測試與效能 by Justin Lin
12. 除錯、測試與效能
Justin Lin
•
153 views
11. 常用內建模組 by Justin Lin
11. 常用內建模組
Justin Lin
•
149 views
8. open() 與 io 模組 by Justin Lin
8. open() 與 io 模組
Justin Lin
•
245 views
7. 例外處理 by Justin Lin
7. 例外處理
Justin Lin
•
115 views
6. 類別的繼承 by Justin Lin
6. 類別的繼承
Justin Lin
•
166 views
4. 流程語法與函式 by Justin Lin
4. 流程語法與函式
Justin Lin
•
188 views
3.型態與運算子 by Justin Lin
3.型態與運算子
Justin Lin
•
199 views
1. Python起步走 by Justin Lin
1. Python起步走
Justin Lin
•
664 views
資料永續與交換
2.
10. 資料永續與交換 • 學習目標 –
使用 pickle 與 shelve – 認識 DB-API 2.0 – 使用 sqlite3 模組 – 處理 CSV、JSON、XML 2
3.
使用 pickle 模組 •
如果要序列化 Python 物件,可以使用內建 的 pickle 模組 • 將一個Python 物件轉換為 bytes,這稱為 Pickling,相反的操作則稱之為 unpickling, 會將 bytes 轉換為 Python 物件 3
4.
• 若想將物件轉換為 bytes,可以使用 dumps()
函式 • 若想將一個代表物件的 bytes 轉換為物件, 可以使用 loads() 函式 4
5.
• 可以 pickling
與unpickling 的型態包括內 建型態、使用者自定義的頂層函式、類別 等 • 如果無法進行 pickling 或 unpickling,就 會引發 PicklingError 或 UnpicklingError 5
6.
• 保存在檔案,從檔案讀取 6
7.
7
8.
8
9.
• pickling 時實際採用的模式,是
Python 的 專屬格式 • pickle 的保證是能向後相容未來的新版本 • 可以使用 pickle.HIGHEST_PROTOCOL 來得知目前可用的最新格式版本為哪一個 • pickle.DEFAULT_PROTOCOL 則是 pickle 模組的預設版本 • 如果必要指定格式版本, • 可以在使用 dumps()、dump()、loads() 或 load() 時,指定其 protocol 參數 9
10.
使用 shelve 模組 •
shelve 物件行為上像是字典的物件 • 鍵的部份必須是字串,值的部份可以是 pickle 模組可處理的 Python 物件 • 它直接與一個檔案關聯,因此使用上就像 個簡單的資料庫介面 10
11.
11
12.
12
13.
13
14.
14
15.
認識 DB-API 2.0 •
DB-API 2.0 由PEP 249 規範,所有的資料 庫介面都應該符合這個規範 • 以便撰寫程式時能有一致的方式,撰寫出 來的程式也便於跨資料庫執行 • Connection 基本上要具備以下的方法: 15
16.
• Cursor 物件基本上必須具備以下方法: 16
17.
使用 sqlite3 模組 •
Python 中內建了 SQLite 資料庫,這是個 用 C 語言撰寫的輕量級資料庫 • 資料庫本身的資料可以儲存在一個檔案中, 或者是記憶體之中,後者對於資料庫應用 程式的測試非常的方便 • 若想使用 SQLite 作為資料庫,並撰寫 Python 程式與資料庫進行操作,可以使用 sqlite3 模組 17
18.
建立資料庫與連線 • 可以傳給 connect()
一個 ':memory:' 字串,這樣會在記憶體中建立一個資料庫 18
19.
建立表格與新增資料 19
20.
• Connection 物件實作了情境管理器,可 以搭配
with 陳述使用 • 在 with 區塊的動作完成之後,會自動 commit() 與 close(),若發生例外,則 會自動 rollback() 20
21.
• 若要新增一筆資料,也是使用 Cursor
的 execute()方法 21
22.
查詢資料 • 先用 Cursor
的 execute()執行查詢語句 • fetchone() 可以取得結果集合中的一筆 資料 • fetchall()取得結果集合中的全部資料 • fetchmany() 指定要從結果集合中取得幾 筆資料 22
23.
更新與刪除資料 23
24.
參數化 SQL 語句 •
直接使用 + 來串接字串以組成 SQL,容易 引發 SQL Injection 的安全問題 24
25.
• 使用 f-strings、字串的
format(),或者 是舊式的 % 進行格式化,也會有同樣問題 25
26.
• Cursor 的
execute() 方法本身可以將 SQL 語句參數化 • 有兩種參數化的方式:使用問號(?)或具 名佔位符號 26
27.
• 如果你有多筆 SQL
必須執行,雖然可以使 用 for in 自行處理: 27
28.
• 用 Cursor
的 executemany() 會更方便: 28
29.
簡介交易 • 交易的四個基本: – 要求原子性(Atomicity) –
一致性(Consistency) – 隔離行為(Isolation behavior) – 持續性(Durability) • 依英文字母首字簡稱為 ACID 29
30.
• 除了一些會隱含地提交之情況,sqlite3 模組的預設實作,並不會自動提交 • 必須自行呼叫
Connection 的 commit() 來進行提交 • 如果交易過程因為發生錯誤或其他情況, 必須撤回交易時,可以呼叫 Connection 的 rollback() 撤回操作 30
31.
• 一個基於例外發生時必須撤消交易的示範: 31
32.
• 在隔離性方面,SQLite 資料庫在更新資料 的相關操作時,預設會鎖定資料庫直到該 次交易完成 •
多個連線時就會造成等待的狀況 • sqlite3 模組的 connect() 函式有個 timeout 可指定等待多久,若逾時就引發 例外,預設是 5.0,也就是是 5 秒 32
33.
• sqlite3 模組的
Connection 物件有個 isolation_level 屬性,可用來設定或 得知目前的隔離性設定 • 預設是'',實際上在 SQLite 資料庫就會產 生 BEGIN 陳述 • 如果 isolation_level 被設置為 None, 表示不做任何的隔離性,也就成為自動提 交,每次 SQL 更新相關操作時,就不用自 行呼叫 Connection 的 commit()方 法 33
34.
• 不設隔離性,在多個連線存取資料庫的情 況下,就會引發資料不一致的問題 – 更新遺失(Lost
update) – 髒讀(Dirty read) – 無法重複的讀取(Unrepeatable read) – 幻讀(Phantom read) 34
35.
更新遺失 35
36.
髒讀 36
37.
無法重複的讀取 37
38.
幻讀 • 同一交易期間,讀取到的資料筆數不一致。 例如交易 A
第一次讀取得到五筆資料,此 時交易 B 新增了一筆資料,導致交易 B 再 次讀取得到六筆資料。 38
39.
• 由於各家資料對於交易的支援程度並不相 同,實際上該採用與如何進行設定也就有 所差異 • 就
sqlite3 模組的實作來說, Connection 物件的 isolation_level 還可以設定 SQLite 資料庫支援的隔離層級 'DEFERRED'、'IMMEDIATE' 或 'EXCLUSIVE' 39
40.
CSV • 全名為 Comma
Separated Values,是通 用在試算表、資料庫間的資料交換格式 • Python 提供了 csv 模組,可隱藏 CSV 的 讀寫細節,讓開發人員輕鬆處理 CSV 格式 40
41.
41
42.
42
43.
• 若想將先前下載的 CSV
檔案轉存為 UTF-8 的話 43
44.
• 可以使用 csv
的 DictReader()、 DictWriter(),將 CSV 以 dict 的方式 處理 44
45.
• 使用 fieldnames
自行指定欄位名稱: 45
46.
• 有一些 dict,想要寫出為CSV: 46
47.
47
48.
48
49.
JSON • 全名 JavaScript
Object Notation,為 JavaScript 物件實字 • 可以在〈Introducing JSON〉找到詳細的 JSON 格式說明,以及各語言中可處理 JSON 的程式庫 49
50.
• 在 Python
中可以使用 dict 與 list 等來 模仿: 50
51.
• 在 JSON
的物件格式之中: – 名稱必須用 "" 雙引號包括。 – 值可以是 “” 雙引號包括的字串,或者是數字、 true、false、null、JavaScript 陣列(相 當於Python 的 list)或子 JSON 格式 51
52.
• 數字、true、false、null、使用 ""
包 括的字串等,都是合法的 JSON 格式 • Python 內建了 json 模組,API 的使用上 類似 pickle • 內建型態轉為 JSON 格式的過程稱為編碼 (Encoding) • 將 JSON 格式轉為 Python 內建型態之過程 稱為解碼(Decoding) 52
53.
53
54.
• 將 Python
內建型態編碼為 JSON 格式,可 以使用 json.dumps() 54
55.
• indent 參數可指定數字,這會為JSON
格 式加上指定的空白數量進行縮排: 55
56.
• seperators 預設是
(', ', ': '),如 果指定為(',', ':'),就不會有空白了 – 像是在資料進行網路傳輸時,若能省掉不必要 的空白,就可省去不必要的流量開銷 56
57.
• 如果呼叫 json.dump()
時指定了非內建 型態,預設是會引發 TypeError: 57
58.
• 可以指定一個轉換函式給 default
參數, 轉換函式必須傳回 Python 內建型態,以進 行 JSON 編碼: 58
59.
• 若要將物件編碼為 JSON
並寫至檔案: • 要將 JSON 格式解碼為內建型態物件: 59
60.
• 可以在使用 json.loads()
時,指定一個 函式給 object_hook: 60
61.
• 若要從檔案中讀取 JSON
並解碼: 61
62.
XML • 在處理XML 時,Python
提供了幾個模組: – xml.dom – xml.sax – xml.etree 62
63.
• Python 建議
xml.etree.ElementTree • 相對於 DOM 來說,ElementTree 更為簡 單而快速 • 相對於 SAX 來說,也有 iterparse() 可 以使用,可以在讀取 XML 文件的過程中即 時進行處理 63
64.
64
65.
• 取得 XML
中全部的標籤名稱: 65
66.
• 可以使用 fromstring()
來剖析 XML 字 串,這會直接傳回一個 Element 實例,代 表著XML 字串的根節點 66
67.
67
68.
• 可以指定 XPath
表示式來取得想要的標籤: 68
69.
• 想要直接取得 XML
字串的 bytes 資料, 可以使用 tostring(): 69
70.
• 可以使用 append()
來附加一個元素,使 用 insert() 來插入元素,使用 remove() 可以移除元素,使用 set() 設定元素屬性 70
71.
71
72.
• 使用 iterparse()
可以針對標籤的 'start'、'end'、'start-ns'、 'end-ns' 事件發生時,進行相對應處理 72