




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第12章
使用Python進行數(shù)據(jù)管理目錄2引言數(shù)據(jù)對象的持久化使用itertools模塊分析和處理數(shù)據(jù)實例:教務(wù)信息數(shù)據(jù)分析與處理Python中SQLite數(shù)據(jù)庫的使用實例:封裝MySQL數(shù)據(jù)庫操作12.112.212.312.412.512.6
12.1引言12.1引言4信息管理數(shù)據(jù)分析數(shù)據(jù)管理在當(dāng)今社會環(huán)境下,各個領(lǐng)域都在產(chǎn)生著大量的數(shù)據(jù),如財務(wù)數(shù)據(jù)、醫(yī)療數(shù)據(jù)、社交網(wǎng)絡(luò)數(shù)據(jù)等。在這些領(lǐng)域中,數(shù)據(jù)的分析和管理都具有不可替代的作用。本章將首先介紹如何使用持久化模塊持久化地存儲程序中的數(shù)據(jù)對象,隨后將會向讀者展示如何使用Python中的itertools模塊對數(shù)據(jù)進行處理和分析,最后將介紹如何在Python中使用一種更為高級的數(shù)據(jù)管理工具—數(shù)據(jù)庫,以應(yīng)對更為復(fù)雜的數(shù)據(jù)管理需求。信息分析在本章中,將會使用一個“教務(wù)信息”數(shù)據(jù)集作為貫穿全章的例子,以展示各項數(shù)據(jù)分析和管理功能。12.1引言5這個數(shù)據(jù)集由3部分組成:學(xué)生信息student、課程信息course和選課信息election。以嵌套列表的形式給出這三部分數(shù)據(jù)。01020304GOAL12.2數(shù)據(jù)對象的持久化12.2數(shù)據(jù)對象的持久化7在很多場景中,我們希望將程序中的數(shù)據(jù)對象保存下來,以供下次運行或其他程序使用,這種功能需求被稱為數(shù)據(jù)持久化。在本節(jié)將分別介紹如何使用pickle、json和shelve三個模塊對數(shù)據(jù)對象進行持久化存儲和隨機讀取。01020304GOAL12.2.1使用pickle模塊存取對象8picle模塊的功能是將Python對象轉(zhuǎn)換為二進制字節(jié)序列并存儲在文件中。被轉(zhuǎn)換的對象包括基本數(shù)據(jù)類型,系統(tǒng)和用戶自定義的類對象,甚至包括列表、元組等容器對象。這個模塊的使用十分簡單,只需使用該模塊的dump(data,file)函數(shù)即可將數(shù)據(jù)對象data存儲在file文件對象中,而使用load(file)文件可以將保存在file中的持久化數(shù)據(jù)對象讀取出來。12.2.1使用pickle模塊存取對象9此時,student對象被原樣取出。然而,這里存在一個問題,存儲在文件中的數(shù)據(jù)對象只能一次性地被讀入內(nèi)存,而不支持隨機訪問其中一條數(shù)據(jù)。假設(shè)有上萬條學(xué)生信息,而經(jīng)常一次只需要訪問少數(shù)幾位學(xué)生的信息,這時一次讀入全部文件的方式就顯得十分笨拙且低效了。為解決這個問題,用戶可以使用下一小節(jié)中的shelve模塊實現(xiàn)持久化對象的隨機讀取。12.2.2使用json模塊進行數(shù)據(jù)序列化與反序列化10json模塊支持將數(shù)據(jù)按照JSON格式序列化后存儲入文件,或者從具有JSON格式的文件中讀取數(shù)據(jù)。json模塊也提供了dump、load等函數(shù)進行數(shù)據(jù)處理,使用方法和功能與pickle模塊非常相似,但兩個模塊在數(shù)據(jù)可互操作性與可讀性方面存在差異。經(jīng)json模塊轉(zhuǎn)化后的數(shù)據(jù)可以被非Python程序讀取和使用,而pickle模塊所使用的數(shù)據(jù)格式僅限Python使用。此外,json模塊采用文本序列化格式對數(shù)據(jù)進行編碼,轉(zhuǎn)化后的數(shù)據(jù)可以直接閱讀;而pickle模塊使用二進制格式來存儲數(shù)據(jù),經(jīng)pickle轉(zhuǎn)化的數(shù)據(jù)文件通常難以理解。相比于pickle模塊,json模塊在進行數(shù)據(jù)處理時具有更高的安全性,當(dāng)用戶需要對不信任的數(shù)據(jù)進行反序列化操作時,使用json模塊可以避免安全漏洞的產(chǎn)生。12.2.2使用json模塊進行數(shù)據(jù)序列化與反序列化1112.2.2使用json模塊進行數(shù)據(jù)序列化與反序列化12json模塊還提供了dumps和loads函數(shù),用于Python對象與具有JSON格式字符串(str)的相互轉(zhuǎn)化程序輸出為:序列化后的dic:{"a":"Python","b":"C++","c":"Java","d":"SQL"}序列化后的數(shù)據(jù)類型:<class'str'>反序列化后的json_str:{'Python':'a','C++':'b','Java':'c','SQL':'d'}反序列化后的數(shù)據(jù)類型:<class'dict'>
12.2.3使用shelve模塊隨機訪問對象shelve模塊提供了類似字典的持久化解決方案。對于要對字典做的幾乎所有事情,都可以用shelve實現(xiàn)。兩者唯一的區(qū)別是shelve模塊的數(shù)據(jù)持久化對象存儲在硬盤中而不是內(nèi)存中,只有當(dāng)需要的時候某一字典項才會被調(diào)入內(nèi)存。雖然會有一定速度上的犧牲,但是這意味著我們可以在內(nèi)存有限的情況下操作非常大的字典,更為重要的是,這個字典是持久化的,可以在程序的多次運行或多個程序中被使用。12.2.3使用shelve模塊隨機訪問對象如前所述,與pickle模塊只有讀入所有文件內(nèi)容才可以訪問數(shù)據(jù)對象不同,當(dāng)訪問“l(fā)ists”數(shù)據(jù)時,只有該項內(nèi)容會被調(diào)入內(nèi)存,即“tuple”項不會被同時讀入。12.2.3使用shelve模塊隨機訪問對象下面通過將教務(wù)信息使用shelve模塊進行持久化12.3使用itertools模塊分析和處理數(shù)據(jù)12.3使用itertools模塊分析和處理數(shù)據(jù)17Python標(biāo)準庫中的itertools模塊為用戶提供了一組迭代器工具,利用這組工具用戶可以進行一些簡單的數(shù)據(jù)分析和處理。下面將簡要介紹這個模塊中的兩種常用函數(shù):一種是數(shù)據(jù)過濾函數(shù)組,另一種是groupby函數(shù)。最后,將繼續(xù)使用“教務(wù)信息”數(shù)據(jù)集展示該模塊在數(shù)據(jù)分析和處理上的應(yīng)用。12.3.1數(shù)據(jù)過濾函數(shù)18filterfalse函數(shù)數(shù)據(jù)過濾compress函數(shù)商業(yè)策略compress的第一個參數(shù)為輸入數(shù)據(jù)(如列表、迭代器,甚至字符串),第二個參數(shù)為與輸入數(shù)據(jù)中每個元素對應(yīng)的布爾值組成的列表。調(diào)用compress函數(shù),將得到由輸入數(shù)據(jù)中對應(yīng)布爾值為True的數(shù)據(jù)元素構(gòu)成的迭代器,即實現(xiàn)了“掩碼”的功能。例如,當(dāng)輸入數(shù)據(jù)為[1,2,3,4,5],對應(yīng)的布爾值列表為[True,False,False,False,True]時,只有1和5會在compress返回的迭代器中出現(xiàn)。filterfalse函數(shù)的功能與compress類似,但過濾條件可由用戶構(gòu)造函數(shù)自行定義。filterfalse函數(shù)的第一個參數(shù)是過濾條件函數(shù)(function),第二個參數(shù)為可迭代對象(列表、迭代器、字符串等)。其中,function的返回值應(yīng)為布爾類型或可等價為布爾類型,否則filterfalse函數(shù)無效。function也可由lambda表達式定義。對于可迭代對象的每個數(shù)據(jù)元素x,若function(x)的值為False,則該數(shù)據(jù)元素x將出現(xiàn)在filterfalse函數(shù)返回的迭代器中,否則將被丟棄。12.3.1數(shù)據(jù)過濾函數(shù)19filterfalse函數(shù)compress函數(shù)商業(yè)策略12.3.1數(shù)據(jù)過濾函數(shù)20dropwhile函數(shù)數(shù)據(jù)過濾takewhile函數(shù)商業(yè)策略takewhile函數(shù)的輸入是一個布爾值函數(shù)和一個數(shù)據(jù)列表(或其他迭代器),該函數(shù)會返回列表或迭代器中的數(shù)據(jù)元素直到布爾值函數(shù)的結(jié)果為False為止。與takewhile相反,dropwhile會對同樣的輸入做出相反的輸出行為,即該函數(shù)會忽略所有輸入元素直到函數(shù)返回結(jié)果為False為止。下面的兩段代碼分別利用這兩個函數(shù)實現(xiàn)了“過濾出”和“過濾掉”個位數(shù)的功能。12.3.2groupby函數(shù)21Groupbygroupby函數(shù)是itertools模塊中最有用、最強大的數(shù)據(jù)分析和處理函數(shù)之一。該函數(shù)的輸入是一組數(shù)據(jù)(以列表或迭代器的形式輸入)和一個key函數(shù)。其效果是將key函數(shù)作用于各個數(shù)據(jù)元素,并根據(jù)key函數(shù)結(jié)果,將擁有相同函數(shù)結(jié)果的元素分到一個新的迭代器中,而每個新的迭代器以函數(shù)返回結(jié)果為標(biāo)簽。例如,可以對身高數(shù)據(jù)使用這樣一個key函數(shù):如果身高大于180,則返回"tall";如果身高低于160,則返回"short";中間的值返回"middle"。最終,所有身高將分為3個循環(huán)器,即"tall"、"short"、"middle"12.3.2groupby函數(shù)22對于groupby函數(shù),有以下兩點需要注意。首先,如上面的例程所示,在分組之前,需要使用sorted將原來的數(shù)據(jù)元素根據(jù)key函數(shù)進行排序,然后讓同組元素向相鄰的位置上“靠攏”實現(xiàn)分組。其次,groupby產(chǎn)生的組事實上并不是真實的迭代器,它只是原始輸入的一個視圖。也就是說,在函數(shù)移動到下一組數(shù)據(jù)時,之前的組就會失效。因而,為了在之后的程序中使用這些分組,最好將它們保存在一個列表中。Groupby【輸出結(jié)果】middle[165,170,177]short[158,159]tall[191,181,182,190]12.4實例:教務(wù)信息數(shù)據(jù)分析與處理12.4教務(wù)信息數(shù)據(jù)分析與處理241.入學(xué)成績大于或等于510分的學(xué)生有哪些?這個問題實際上是希望從所有的學(xué)生記錄中過濾出入學(xué)成績大于等于510分的學(xué)生記錄。在下面的代碼中,利用filterfalse函數(shù)配合一個lambda表達式來實現(xiàn)這個過濾功能。若學(xué)生信息記錄中的入學(xué)成績大于等于510,則lambda表達式將返回False,并將該數(shù)據(jù)項加入最終返回的迭代器中。12.4教務(wù)信息數(shù)據(jù)分析與處理252.每個學(xué)生的算術(shù)平均分是多少?在“教務(wù)信息”數(shù)據(jù)集中,成績信息被保存在選課記錄election中。在下面的代碼中,先利用groupby函數(shù)將選課信息按學(xué)號分組,得到每個學(xué)生的選課列表,然而根據(jù)這個選課列表中的成績項計算每位學(xué)生的算術(shù)平均分。12.4教務(wù)信息數(shù)據(jù)分析與處理263.選課數(shù)超過2人次的課程有哪些?在這個問題中,希望輸出選課數(shù)超過2人次的課程的課程名。同樣,可以利用前一個問題中類似的方法將選課信息按課程號分組,根據(jù)每組選課列表的大小判斷每門課的選課人次是否大于2。再利用compress函數(shù)過濾掉課程列表course中選課數(shù)小于等于2的課程并輸出。12.5Python中SQLite數(shù)據(jù)庫的使用12.5Python中SQLite數(shù)據(jù)庫的使用28至今本書已經(jīng)介紹了兩種數(shù)據(jù)持久化的方案,一種是在第11章中介紹的文件處理,另一種是在本章第1節(jié)中介紹的持久化模塊的方法。通過比較,可以看到后者在數(shù)據(jù)讀取和處理方面為用戶提供了更為便利的方案。在本節(jié)中,將繼續(xù)介紹一種更為高級的數(shù)據(jù)持久化方案—數(shù)據(jù)庫。數(shù)據(jù)庫出現(xiàn)在大多數(shù)的日常軟件開發(fā)過程中,可以極大地提高數(shù)據(jù)管理、分析與處理的效率。Python支持多種數(shù)據(jù)庫,包括SQLite、MySQL和Oracle等主流數(shù)據(jù)庫,也提供了多種數(shù)據(jù)庫連接方式,如ODBC、DAO和專用數(shù)據(jù)庫連接模塊等。本著通俗與實用的原則,在本章中,將以SQLite數(shù)據(jù)庫為例介紹Python中的數(shù)據(jù)庫編程。掌握了Python中的SQLite數(shù)據(jù)庫編程,讀者就會很容易地學(xué)會使用其他數(shù)據(jù)庫(特別是MySQL)。12.5.1SQLite29SQLite是一款簡單的嵌入式關(guān)系型數(shù)據(jù)庫。因為它的輕便和高效,SQLite有著廣泛的應(yīng)用。Python中提供了sqlite3模塊負責(zé)SQLite數(shù)據(jù)庫與Python的連接。使用這個模塊操作SQLite數(shù)據(jù)庫可以分為以下幾步。(1)導(dǎo)入sqlite3模塊。(2)調(diào)用connect函數(shù)連接SQLite數(shù)據(jù)庫,得到連接對象conn。(3)執(zhí)行數(shù)據(jù)庫操作。①調(diào)用conn對象的execute函數(shù)執(zhí)行數(shù)據(jù)庫操作語句(SQL語句)
②調(diào)用conn對象的commit函數(shù)提交對數(shù)據(jù)庫的修改。(4)查詢數(shù)據(jù)庫。①使用execute方法獲得游標(biāo)對象cur。②利用游標(biāo)對象cur的futechall、fectchmany或fecthone方法獲得查詢結(jié)果。(5)關(guān)閉游標(biāo)cur和連接對象conn。本節(jié)的后半部分將以“教務(wù)信息”為例,分別介紹上述步驟中的操作。FourThreeTwoOne連接數(shù)據(jù)庫是對數(shù)據(jù)庫實質(zhì)性操作的第一步,下面的代碼顯示了如何使用connect方法連接到當(dāng)前路徑下名為admin.db的數(shù)據(jù)庫(其本質(zhì)也是一個文件,讀者可以將其與持久化模塊方式中保存數(shù)據(jù)對象的文件做類比,以幫助自己理解),并獲得一個數(shù)據(jù)庫連接對象conn。如果該數(shù)據(jù)庫不存在,那么它會被創(chuàng)建。在創(chuàng)建并連接到數(shù)據(jù)庫后,就可以開始對數(shù)據(jù)庫的操作了。在sqlite3模塊中,需要使用SQL語句操作數(shù)據(jù)庫。結(jié)構(gòu)化查詢語言(StructuredQueryLanguage,SQL)是一種高級的數(shù)據(jù)庫查詢語言,可以用于查詢、更新和管理關(guān)系型數(shù)據(jù)庫。盡管關(guān)于SQL的系統(tǒng)介紹已經(jīng)超出了本書所涉及的范圍,我們將在利用到SQL語句的地方盡可能地做出說明以幫助沒有數(shù)據(jù)庫基礎(chǔ)的讀者學(xué)習(xí)。12.5.2連接數(shù)據(jù)庫12.5.3創(chuàng)建表31關(guān)系型數(shù)據(jù)庫中,數(shù)據(jù)是以表的形式進行管理的。數(shù)據(jù)庫中的一張表包括表結(jié)構(gòu)(即表中每列數(shù)據(jù)的字段名)和表記錄(即表中的每行記錄)。SQL語句中創(chuàng)建一個空表的語法如下。注意,SQL是大小寫不敏感的。CREATETABLE表名稱(字段名1數(shù)據(jù)類型,字段名2數(shù)據(jù)類型,…)例如,代碼清單12-8將在之前連接到的數(shù)據(jù)庫中創(chuàng)建一個名為student的學(xué)生表、一個名為course的課程表和一個名為election的選課表。其中,VARCHAR是可變長字符串類型,PRIMARYKEY表明ID是區(qū)別不同記錄的主鍵,NOTNULL表明該項不得為空。12.5.3創(chuàng)建表32代碼示例12.5.4插入數(shù)據(jù)記錄33R在SQL中可以使用INSERT語句向表中添加一條記錄,其語法如下:INSERTINTO表名稱VALUES(值1,值2,…)可以使用代碼清單12-9分別將“教務(wù)信息”數(shù)據(jù)集中的數(shù)據(jù)記錄添加到剛剛創(chuàng)建的3個表中。12.5.5查詢數(shù)據(jù)記錄SQL中提供的SELECT語句可以查詢表中的數(shù)據(jù)記錄,其語法如下:SELECT列名稱FROM表名稱[WHERE行篩選條件][GROUPBY字段名[HAVING分組篩選條件]]在sqlite3模塊中,可以通過execute函數(shù)返回的游標(biāo)對象獲得查詢結(jié)果。可以使用代碼清單12-10從course表中查詢所有課程代碼大于2的課程。查詢篩選SQL中還提供了表連接功能,即將多個表通過幾個相同的字段連接在一起。例如,可以利用課程表與選課表之間的共同字段課程號將兩個表連接起來,以獲得每條選課記錄中的課程名,接下來配合GROUPBY子句就可以輕易地完成13.2.2小節(jié)中的第三個問題,代碼如下:12.5.5查詢數(shù)據(jù)記錄在上面的例子中,使用fetchall方法一次性返回了所有查詢結(jié)果。sqlite3模塊還提供了fetchone方法,即以元組的形式一次返回一行查詢結(jié)果,若沒有符合條件的查詢結(jié)果,則返回空元組;fetchmany方法一次返回不大于指定數(shù)目的結(jié)果,讀者可以想象分頁顯示的使用場景。12.5.6更新和刪除數(shù)據(jù)記錄在數(shù)據(jù)管理過程中,數(shù)據(jù)更新是一個很常見的需求。12.5.7回滾與關(guān)閉數(shù)據(jù)庫在前面的代碼中,每次對數(shù)據(jù)庫進行更改后都會使用commit函數(shù)確認更改,否則對數(shù)據(jù)庫的更改將不會生效。這種數(shù)據(jù)庫操作方式看似復(fù)雜,實則
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國高壓導(dǎo)線膠套行業(yè)發(fā)展研究報告
- 2025至2030年中國雪紡縐布行業(yè)發(fā)展研究報告
- 2025至2030年中國鎂鋁鋅合金模具行業(yè)發(fā)展研究報告
- 2025至2030年中國鐵水濾網(wǎng)行業(yè)發(fā)展研究報告
- 2025至2030年中國金剛石玻璃割刀行業(yè)發(fā)展研究報告
- 2025至2030年中國西服上裝衣架行業(yè)發(fā)展研究報告
- 2025至2030年中國茶瓷器行業(yè)發(fā)展研究報告
- 2025至2030年中國膠合板門行業(yè)發(fā)展研究報告
- 2025至2030年中國綿羊正石服裝革行業(yè)發(fā)展研究報告
- 2025至2030年中國精巧型讀卡器行業(yè)發(fā)展研究報告
- 醫(yī)療器械隨貨同行單模版
- 麥克維爾冷水機組使用說明書
- 2023年安徽省高考理科數(shù)學(xué)試卷及參考答案(word版)
- 馬克思主義新聞觀十二講之第七講堅持正面宣傳為主課件
- 康復(fù)科實習(xí)生入科教育
- 物理課件:《功》功和機械能PPT優(yōu)質(zhì)課件
- 盾構(gòu)法隧道施工原理、常見難點和問題
- 《國際貿(mào)易實務(wù)》全書電子教案完整版教學(xué)設(shè)計
- 檔案管理基礎(chǔ)(第5章 檔案的保管)
- JTT888-2020公共汽車類型劃分及等級評定_(高清-最新)
- 應(yīng)用文寫作之調(diào)查報告(課堂PPT)
評論
0/150
提交評論