Python

解決問題 Python (3)

教學目標

主要解決如何判斷兩個字串差別程度,以利針對傳送文字內容適當回答的問題。

重點概念

首先當我們在開發聊天機器人時,要如何了解使用者傳送文字內容中的關鍵資訊呢?這時我們就能夠透過編輯距離計算兩個字串差別的程度,就能夠初步了解使用者傳送文字內容中的關鍵資訊,同時回答正確的關鍵資訊。

接著所謂編輯距離,又稱萊文斯坦距離,在 1965 年由俄羅斯科學家弗拉基米爾·萊文斯坦提出此概念,概念主要是指兩個字串之間,由第一個字串轉換成第二個字串所需的最小編輯操作次數,其中編輯過程包括下述三種操作,分別為:

  1. 替換字元
  2. 插入字元
  3. 刪除字元

在 Python 中有提供「Python-Levenshtein」套件能夠讓我們方便計算編輯距離,所以我們必須先安裝套件。

安裝套件

1
$ sudo pip install python-Levenshtein

再來我們就能夠透過「Python-Levenshtein」套件計算編輯距離,我們假設的應用情境為有個關鍵字為「安裝步驟」,然後我們有三個使用者傳送文字內容,此時我們想要判斷與關鍵字的差異,主要可以使用 distance(字串一, 字串二) 函式計算萊文其坦距離和 Levenshtein.ratio(字串一, 字串二) 函式計算萊文斯坦比。

萊文斯坦距離

計算萊文斯坦距離主要是由第一個字串轉換成第二個字串所需的最小編輯操作次數,其中編輯過程包括下述三種操作,其演算法實作是以動態規劃為主。

萊文斯坦比

計算萊文斯坦比公式為 r = (sum - ldist) / sum,其中 sum 為字串一和字串二的長度總和,ldist 是萊文斯坦距離,但請注意此時萊文斯坦距離中刪除字元為加一計算和替換字元為加二計算。

程式範例

levenshtein_distance.py

1
2
3
4
5
6
7
8
9
10
11
12
#coding:utf-8
import Levenshtein
keyword = '安裝步驟'
message1 = '我想了解安裝的步驟'
message2 = '請問安裝到底有哪些步驟呢?'
message3 = '我想請問安裝到底有哪些產品呢?'
print 'message1 (distance): ' , Levenshtein.distance(keyword,message1)
print 'message2 (distance): ' , Levenshtein.distance(keyword,message2)
print 'message3 (distance): ' , Levenshtein.distance(keyword,message3)
print 'message1 (ratio): ' , Levenshtein.ratio(keyword,message1)
print 'message2 (ratio): ' , Levenshtein.ratio(keyword,message2)
print 'message3 (ratio): ' , Levenshtein.ratio(keyword,message3)

執行結果

1
2
3
4
5
6
7
$ python levenshtein_distance.py
message1 (distance): 10
message2 (distance): 17
message3 (distance): 24
message1 (ratio): 0.615384615385
message2 (ratio): 0.484848484848
message3 (ratio): 0.27027027027

最後我們根據上述程式範例,我們很難設定萊文斯坦距離的門檻值判斷使用者傳送文字內容是否與關鍵字非常相似,此我們就能夠透過設定萊文斯坦比的門檻值判斷使用者傳送文字內容是否與關鍵字非常相似,例如設定門檻值為 0.4 時,就能夠透過萊文斯坦距比判斷出「我想了解安裝的步驟」和「請問安裝到底有哪些步驟呢?」和關鍵字「安裝步驟」非常相似,此時就能夠回傳關鍵字「安裝步驟」所對應的回答內容。但是請注意當文字內容過長時僅透過萊文斯坦距比判斷門檻值將不適用,需要搭配其它方式提高準確度。

總結我們透過在 Python 中提供的「Python-Levenshtein」套件解決如何判斷兩個字串差別程度,以利針對傳送文字內容適當回答的問題,同時初步應用於聊天機器人的問答應用中。

相關資源

解決問題 Python (2)

教學目標

主要解決如何自動化讀取 Excel 檔案中的關鍵資訊的問題。

重點概念

首先在企業中我們最常使用且最熟悉的軟體通常就是 Office 辦公軟體,其中若我們要安排時間以 Excel 軟體最實用,同時我們可以搭配 SharePoint 企業內部網站平台多人共同編輯 Excel 檔案和透過 Outlook 安排相關會議通知的時間等整合應用。

接著關鍵資訊皆存在於 Excel 檔案中,此時若我們需要自動化讀取 Excel 檔案中的關鍵資訊,以利整合其它通訊軟體或網站 APP 提供使用者最即時的資訊,像是:LINE、Facebook Messager、…。

再來為了解決上述的問題,我們就能夠透過 Python 中的 openpyxl 套件讀取 Excel 檔案 (*.xlsx) 的關鍵資訊,只需簡單三步驟,分別為:

  1. 載入套件
  2. 開啟檔案
  3. 讀取內容

載入套件

1
2
#coding:utf-8
from openpyxl import load_workbook

開啟檔案

1
wb = load_workbook(filename = 'schedule.xlsx')

讀取內容

1
2
sheet_ranges = wb[u'時程表']
print(sheet_ranges['A1'].value)

最後讀取 Excel 檔案的關鍵資訊只是開始第一步,下一步則要思考如何了解使用者的對話,有效進行資料處理與資料分析,以利提供使用者最需要的關鍵資訊,這將會是一大挑戰。當然我們也可以使用 Excel VBA,但是後續自動化的系統維護和整合分析將會是一大問題,因此我們建議還是透過 Python 進行整合應用。

總結當我們面臨需要自動化讀取 Excel 檔案中的關鍵資訊的問題時,則可以透過 Python 中的 openpyxl 套件讀取 Excel 檔案 (*.xlsx) 的關鍵資訊。

相關資源

解決問題 PostgreSQL (1)

教學目標

主要解決如何在 Python 中使用 PostgreSQL 資料庫的問題。

重點概念

首先 PostgreSQL 主要是強大的開發源碼物件關係資料庫系統,它已經有 15 年以上的積極發展和經過驗證的架構,在可靠性、資料完整性和正確性方面皆有很不錯的評價。同時它完全符合 ACID 原則,完全支持 Foreign Keys、Joins、Views、Triggers 、Stored Procdures、:等,以及包括大多數 SQL 的資料類型,像是 INTEGER、NUMERIC、BOOLEAN、CHAR、VARCHAR、DATE、INTERVAL、TIMESTAMP、…等,當然也支援以二進位的方式儲存龐大物件,包括圖片、聲音或視頻。

接著 PostgreSQL 做為一個企業級資料庫,它主要擁有複雜的功能,像是多版本平行控管、時間恢復點、資料表空間、非同步複製、巢狀交易、線上熱備份、複雜的查詢規劃和優化器、寫入前記錄容錯、… 等。同時它也支援 UNICODE 國際字元集編碼,以及具備高度可擴展性能夠有效管理資料量和同時在線使用者量,但還是會有限制,請參考下表。

限制 最大值
資料庫大小 無限制
資料表大小 32 TB
資料列大小 1.6 TB
資料欄大小 1 GB
每個資料表的列數 無限制
每個資料表的欄數 250 ~ 1600 (取決於欄位類型)
每個資料表的索引數 無限制

再來 PostgreSQL 符合 ANSI SQL:2008 標準,它完全支援子查詢,讀取提交和可序列化的交易隔離層級,同時 PostegreSQL 有一個完整關係的系統目錄支援每個資料庫的多個模式,以及目錄也可以透過 SQL 標準中定義的資訊綱要進行存取。此外它針對資料完整性主要包括 Primary Keys、Foreign Keys、Check Contraints、Unique Contraints、Not Null Contraints、…等,當然它除了能夠有效確保資料完整性之外,還具備大量擴展和進階的功能,像是 LIMIT 和 OFFSET 允許回傳部份結果集,它支援複合、唯一、部份、功能索引以及任何 B-tree、R-tree、hash 或 GiST 儲存方法加速存取速度。

最後 PostgreSQL 支援許多程式語言,像是 ODBC、Java (JDBC)、Python、C++、…等,本篇主要介紹如何在 Python 程式語言透過 psycopg2 模組操作 PostgreSQL 資料庫,主要有幾個步驟,分別為:

  1. 安裝 psycopg2 模組。
  2. 載入 psycopg2 模組。
  3. 建立 PostgreSQL 資料庫連線。
  4. 針對 PostgreSQL 資料庫執行 SQL 指令
  5. 關閉 PostgreSQL 資料庫連線

安裝 psycopg2 模組

1
$ yum install python-psycopg2

載入 psycopg2 模組

1
2
# 載入 psycopg2 模組
import psycopg2

建立 PostgreSQL 資料庫連線

1
2
# 連線至存在的資料庫
conn = psycopg2.connect(database="testdb", user="postgres", password="xxx", host="127.0.0.1", port="5432")

針對 PostgreSQL 資料庫執行 SQL 指令

1
2
3
4
5
6
# 取得指標執行資料庫操作
cur = conn.cursor()
# 執行 SQL 指令
cur.execute("CREATE TABLE test (id serial PRIMARY KEY, num integer, data varchar);")
# 提交目前的交易至資料庫中進行修改
conn.commit()

關閉 PostgreSQL 資料庫連線

1
2
# 關閉  PostgreSQL 資料庫連線
conn.close()

總結我們透過 psycopg2 模組就能夠解決透過 Python 操作 PostgreSQL 資料庫的問題,至於資料庫最基本的 CRUD 操作,僅需更改 SQL 指令為 INSERT、SELECT、UPDATE和 DELETE 即可,其中 SELECT 比較特別需要將「conn.commit()」換成「rows = cur.fetchall()」才能夠讀取 SELECT 指令回傳的全部內容。

相關資源

解決問題 Scrapy (2)

教學目標

透過 Python 中的 Scrapy 架構程式實作多層次爬蟲功能解決收集特定內容的問題。

重點概念

首先任何提供服務的網站通常皆會提供目錄或搜尋功能讓我們能夠找到適當的資訊,此時若我們只知道關鍵字,則要如何進行先搜尋關鍵字之後,接著收集特定內容呢?這就是本篇教學要解決的問題,主要會透過 Python 中的 Scrapy 架構程式實作多層次爬蟲功能,以 Youtube 影片為例。

Scrapy 架構介紹

接著我們會透過 Scrapy 架構程式範例實作多層次爬蟲功能,主要有三個階段,分別為:

  1. 前置階段:透過網址開啟搜尋關鍵字的網頁。
  2. 搜尋階段:透過搜尋關鍵字的網頁,取得關鍵字對應內容的網址。
  3. 收集階段:透過關鍵字對應內容的網址,收集特定內容的資訊。

其中 Scrapy 架構中的資料流主要有五個元件,分別為:

  1. Scrapy Engine
  2. Scheduler
  3. Downloader
  4. Spiders
  5. Item Pipeline

Scrapy 架構程式範例

再來 Scrapy 架構程式範例僅會使用 Scrapy Engine、Spiders 和 Downloader 三個元件為主,請參考下述 Scrapy 架構程式範例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import scrapy
class example(scrapy.spider.Spider):
name='example'
# 透過網址開啟搜尋關鍵字的網頁
keyword='keyword'
start_urls=['http://www.example.com?q='+keyword]
# 透過搜尋關鍵字的網頁,取得關鍵字對應內容的網址
def parse(self,response):
url = response.xpath('…').extract()
keyword = response.xpath('…').extract()
yield scrapy.http.Request(youtube_url, callback = self.parse2, meta={'keyword': keyword})
# 透過關鍵字對應內容的網址,收集特定內容的資訊。
def parse2(self,response):
content = response.xpath('…').extract()
yield {'keyword': response.meta["keyword"]}
yield {'url': response.url}
yield {'content': content}

其中 scrapy.http.Request 物件主要是代表 HTTP 請求,其主要參數主要有 url、callback 和 meta,所謂 url 代表請求的網址,callback 則是請求回應的函數,最後 meta 則是傳送參數,主要是在 Spider 中產生,並且由 Downloader 執行,之後產生 Reponse 物件。其中所謂 scrapy.http.Response 物件主要是代表 HTTP 回應通常被下載至 Spiders 中進行處理。

Scrapy 架構程式應用

最後我們就以 Scrapy 架構程式範例套用至 Youtube 網站收集特定關鍵字影片的觀看數、喜歡數和不喜歡數,主要有三個階段,分別為:

  1. 前置階段:透過 Youtube 網址開啟搜尋關鍵字的網頁。
  2. 搜尋階段:透過 Youtube 搜尋關鍵字的網頁,取得關鍵字對應內容的 Youtube 影片網址 。
  3. 收集階段:透過關鍵字對應內容的 Youtube 影片網址,收集影片觀看數、喜歡數和不喜歡數的資訊。

編輯 YoutubeDataSpider.py 程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import scrapy
import urllib
class YoutubeDataSpider(scrapy.spiders.Spider):
# 透過 Youtube 網址開啟搜尋關鍵字的網頁。
name = 'YoutubeDataSpider'
keywords = ['SAS Viya','SAS 9']
start_urls = []
for keyword in keywords:
start_urls.append('https://www.youtube.com/results?search_query='+urllib.parse.quote_plus(keyword))
# 透過 Youtube 搜尋關鍵字的網頁,取得關鍵字對應內容的 Youtube 影片網址
def parse(self, response):
keyword = response.xpath('//title/text()')[0].extract()
url = 'https://www.youtube.com' + response.xpath('//div[@class="yt-lockup-content"]//a//@href')[0].extract()
yield scrapy.http.Request(url, callback = self.parse2, meta={'keyword': keyword})
# 透過關鍵字對應內容的 Youtube 影片網址,收集影片觀看數、喜歡數和不喜歡數的資訊
def parse2(self, response):
views = response.xpath('//div[@class="watch-view-count"]/text()')[0].extract().replace("views","").replace(",","").replace(" ","")
likes = response.xpath('//button[contains(@aria-label, "like")]//@aria-label')[0].extract().replace("like this video along with","").replace(" other people","").replace(" other person","").replace(",","").replace(" ","")
dislikes = response.xpath('//button[contains(@aria-label, "dislike")]//@aria-label')[0].extract().replace("dislike this video along with","").replace(" other people","").replace(" other person","").replace(",","").replace(" ","")
yield {'keyword': response.meta["keyword"]}
yield {'url': response.url}
yield {'view': views}
yield {'like': likes}
yield {'dislike': dislikes}

執行 YoutubeDataSpider.py 程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
> scrapy runspider YoutubeDataSpider.py -o result.json
2017-10-28 20:09:33 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: scrapybot)
2017-10-28 20:09:33 [scrapy.utils.log] INFO: Overridden settings: {'FEED_FORMAT': 'json', 'FEED_URI': 'result.json', 'SPIDER_LOADER_WARN_ONLY': True}
2017-10-28 20:09:33 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
'scrapy.extensions.telnet.TelnetConsole',
'scrapy.extensions.feedexport.FeedExporter',
'scrapy.extensions.logstats.LogStats']
2017-10-28 20:09:33 [scrapy.middleware] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
'scrapy.downloadermiddlewares.retry.RetryMiddleware',
'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware',
'scrapy.downloadermiddlewares.stats.DownloaderStats']
2017-10-28 20:09:33 [scrapy.middleware] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
'scrapy.spidermiddlewares.referer.RefererMiddleware',
'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
'scrapy.spidermiddlewares.depth.DepthMiddleware']
2017-10-28 20:09:33 [scrapy.middleware] INFO: Enabled item pipelines:
[]
2017-10-28 20:09:33 [scrapy.core.engine] INFO: Spider opened
2017-10-28 20:09:33 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2017-10-28 20:09:33 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2017-10-28 20:09:34 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.youtube.com/results?search_query=SAS+9> (referer: None)
2017-10-28 20:09:34 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.youtube.com/results?search_query=SAS+Viya> (referer: None)
2017-10-28 20:09:35 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.youtube.com/watch?v=6cIppmnzL6M> (referer: https://www.youtube.com/results?search_query=SAS+9)
2017-10-28 20:09:35 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.youtube.com/watch?v=6cIppmnzL6M>
{'keyword': 'SAS 9 - YouTube'}
2017-10-28 20:09:35 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.youtube.com/watch?v=6cIppmnzL6M>
{'url': 'https://www.youtube.com/watch?v=6cIppmnzL6M'}
2017-10-28 20:09:35 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.youtube.com/watch?v=6cIppmnzL6M>
{'view': '9860'}
2017-10-28 20:09:35 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.youtube.com/watch?v=6cIppmnzL6M>
{'like': '25'}
2017-10-28 20:09:35 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.youtube.com/watch?v=6cIppmnzL6M>
{'dislike': '1'}
2017-10-28 20:09:35 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.youtube.com/watch?v=2wXAUBLJGuo&list=PLVBcK_IpFVi8gMnQgAwBWrn0yqjyBnCLV> (referer: https://www.youtube.com/results?search_query=SAS+Viya)
2017-10-28 20:09:35 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.youtube.com/watch?v=2wXAUBLJGuo&list=PLVBcK_IpFVi8gMnQgAwBWrn0yqjyBnCLV>
{'keyword': 'SAS Viya - YouTube'}
2017-10-28 20:09:35 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.youtube.com/watch?v=2wXAUBLJGuo&list=PLVBcK_IpFVi8gMnQgAwBWrn0yqjyBnCLV>
{'url': 'https://www.youtube.com/watch?v=2wXAUBLJGuo&list=PLVBcK_IpFVi8gMnQgAwBWrn0yqjyBnCLV'}
2017-10-28 20:09:35 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.youtube.com/watch?v=2wXAUBLJGuo&list=PLVBcK_IpFVi8gMnQgAwBWrn0yqjyBnCLV>
{'view': '3866'}
2017-10-28 20:09:35 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.youtube.com/watch?v=2wXAUBLJGuo&list=PLVBcK_IpFVi8gMnQgAwBWrn0yqjyBnCLV>
{'like': '22'}
2017-10-28 20:09:35 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.youtube.com/watch?v=2wXAUBLJGuo&list=PLVBcK_IpFVi8gMnQgAwBWrn0yqjyBnCLV>
{'dislike': '4'}
2017-10-28 20:09:35 [scrapy.core.engine] INFO: Closing spider (finished)
2017-10-28 20:09:35 [scrapy.extensions.feedexport] INFO: Stored json feed (10 items) in: result.json
2017-10-28 20:09:35 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 1260,
'downloader/request_count': 4,
'downloader/request_method_count/GET': 4,
'downloader/response_bytes': 154656,
'downloader/response_count': 4,
'downloader/response_status_count/200': 4,
'finish_reason': 'finished',
'finish_time': datetime.datetime(2017, 10, 28, 12, 9, 35, 613798),
'item_scraped_count': 10,
'log_count/DEBUG': 15,
'log_count/INFO': 8,
'request_depth_max': 1,
'response_received_count': 4,
'scheduler/dequeued': 4,
'scheduler/dequeued/memory': 4,
'scheduler/enqueued': 4,
'scheduler/enqueued/memory': 4,
'start_time': datetime.datetime(2017, 10, 28, 12, 9, 33, 973120)}
2017-10-28 20:09:35 [scrapy.core.engine] INFO: Spider closed (finished)

總結我們透過 Python 中的 Scrapy 架構程式實作多層次爬蟲功能,本篇主要以 Youtube 影片為例收集影片觀看數、喜歡數和不喜歡數的資訊。

相關資源

解決問題 MongoDB (2)

教學目標

主要解決如何在 Python 中使用 MongoDB 資料庫的問題。

重點概念

首先我們要如何在 Python 中使用 MongoDB 資料庫,主要是透過 pymongo 模組進行操作,在此之前我們必須先了解 MongoDB 與 SQL 的名詞和概念對應,請參考下表。

SQL 名詞和概念 MongoDB 名詞和概念
Database Database
Table Collection
Row Document
Column Field
Index Index
primary key primary key

接著我們若要使用 MongoDB 資料庫,則必須先了解基本 CRUD 也就是新增、讀取、更新和刪除的操作,但是對於資料庫操作大多數人主要還是熟悉 SQL 語法,所以我們透過 SQL 進行對應,以利快速了解使用。

建立資料表

SQL 語法

1
2
3
4
5
6
7
8
CREATE TABLE people (
id MEDIUMINT NOT NULL
AUTO_INCREMENT,
user_id Varchar(30),
age Number,
gender char(1),
PRIMARY KEY (id)
)

MongoDB 語法

1
2
3
4
5
6
db.createCollection("people")
db.people.insertOne( {
user_id: "Winnie",
age: 25,
gender: "F"
} )

建立資料

SQL 語法

1
2
3
4
5
6
INSERT INTO people(user_id,
age,
gender)

VALUES ("Jack",
25,
"M")

MongoDB 語法

1
2
3
db.people.insertOne(
{ user_id: "Jack", age: 25, status: "M" }
)

查詢資料

SQL 語法

1
2
3
SELECT user_id, status
FROM people
WHERE gender= "F"

MongoDB 語法

1
2
3
4
db.people.find(
{ gender: "F" },
{ user_id: 1, status: 1, _id: 0 }
)

更新資料

SQL 語法

1
2
3
UPDATE people
SET age = age + 1
WHERE gender = "M"

MongoDB 語法

1
2
3
4
db.people.updateMany(
{ gender: "M" } ,
{ $inc: { age: 1 } }
)

刪除資料

SQL 語法

1
2
DELETE FROM people
WHERE status = "M"

MongoDB 語法

1
db.people.deleteMany( { gender: "M" } )

再來我們了解 MongoDB 基本的 CRUD 操作之後,此時就能夠開始在 Python 中透過 pymongo 模組使用 MongoDB 資料庫。

安裝 pymongo 模組

1
$ pip install pymongo

建立 MongoDB 資料庫連線

1
2
from pymongo import MongoClient
client = MongoClient('localhost', 27017)

取得 MongoDB 資料庫實體

1
db = client['test-database']

取得 MongoDB 資料庫集合

1
collection = db.test_collection

新增文件至資料庫中

1
2
3
4
5
posts = db.posts
post = {"author": "Mike",
"text": "My first blog post!",
"tags": ["mongodb", "python", "pymongo"]}
posts.insert_one(post)

取得資料庫中文件內容

1
2
import pprint
pprint.pprint(posts.find_one({"author": "Mike"}))

更新資料庫中文件內容

1
2
posts = db.posts
posts.update_one({"_id":_id},{"$set": {"text": "My first blog post! (Update)"}})

刪除資料庫中文件內容

1
2
posts = db.posts
posts.delete_one({"_id":_id})

最後我們了解如何在 Python 中透過 pymongo 模組使用 MongoDB 資料庫之後,下一步就是開始撰寫適當的 Python 程式語言針對不同的問題進行解決。

總結目前有許多開源專案皆是採用 MongoDB 資料庫為預設資料庫,此時我們就需要了解如何使用 MongoDB 資料庫,但是 MongoDB 資料庫的概念與 SQL 的概念有些不同必須先行了解,才能夠有效進行後續的管理與應用。

相關資源