張小鳳 高正明
摘要:本文主要論述了基于python的SQLite數(shù)據(jù)庫數(shù)據(jù)存儲原理、過程和用途。具體以SQLite3為例,將文本數(shù)據(jù)存儲的過程進行了闡述和說明。
關鍵詞:反應截面、Python、數(shù)據(jù)存儲、SQLite
引言:
在科研學習過程中,為了防止數(shù)據(jù)被反復抓取,我們通常需要運用Python代碼從網(wǎng)站上爬取相關數(shù)據(jù),則需要將數(shù)據(jù)保存到本地,其中最常用的方式就是將數(shù)據(jù)按照設計的數(shù)據(jù)格式保存到指定的文件中,其中常用的數(shù)據(jù)類型為文本文檔txt、表格類文件csv、 excel 等。此外,還可以將數(shù)據(jù)存儲到數(shù)據(jù)庫(例如SQLite3、MySQL等)中,以便能夠便捷讀取及管理數(shù)據(jù)。
SQLite相比于其他數(shù)據(jù)庫,其不需要單獨的進行安裝或者管理服務,即不需要配置,只需要程序調(diào)用即可,不要求為該數(shù)據(jù)庫生成一個單獨的服務器進程且不需要為其單獨配置可操作的系統(tǒng),及不需要配置服務器;其次,SQLite數(shù)據(jù)庫的存儲文件相比于其他存儲文件,其占用磁盤的空間很小,屬于輕量級的文件,且可以在多個跨平臺的系統(tǒng)中進行使用和處理,即該文件不依賴多余的硬件或者軟件配置,就可以實現(xiàn)自給自足;另外,對于ACID,SQLite數(shù)據(jù)庫的訪問和設置均是完全兼容的,即對于同一個SQLite數(shù)據(jù)庫文件而言,它容許多個程序或者程序進程、線程進行安全管理訪問;除此之外,SQLite采用的是 ANSI-C 進行編輯的,同時為了能夠更方便于用戶操作,它提供了簡潔明了的API,同時為了方便用戶查詢數(shù)據(jù)庫的信息,SQL92(SQL2)標準中大部分的查詢功能均被支持使用。
因為Python 2.5x及以上的版本均內(nèi)置了SQLite3數(shù)據(jù)庫引擎,因此直接輸入命令“import sqlite3”即可使用。鑒于SQLite3和Python相結合的優(yōu)點,本文主要闡述如何利用Python將文本數(shù)據(jù)錄入SQLite3數(shù)據(jù)庫。
1、python的操作步驟
① 首先創(chuàng)建一個與數(shù)據(jù)庫文件的連接對象connection,即利用sqlite3.open(),函數(shù);
② 其次創(chuàng)建光標對象cursor,即利用connection.cursor()函數(shù);
③ 然后使SQL語句將會被執(zhí)行,利用cursor.execute()函數(shù);
④ 再利用connection.commit()函數(shù)提交當前事務,或利用cursor.fetchall(),獲得查詢結果;
⑤ 最后將與數(shù)據(jù)庫文件的連接關閉,即利用connection.close()。
2、具體步驟
2.1、逐行讀取指定路徑下文件的文件內(nèi)容
通過采用with語句和open語句的結合,可以安全地實現(xiàn)對文件的打開操作,并利用readlines()函數(shù)以便對文件的每行內(nèi)容進行快速便捷讀取,即對all的數(shù)據(jù)進行拆分。
with open("eedl.all") as f:
text = f.readlines()
2.2、對數(shù)據(jù)進行解析,判斷當前行是不是目標數(shù)據(jù)行
文件包含說明信息和反應截面數(shù)據(jù),如下圖2-1 钚元素與光子的相互作用截面數(shù)據(jù)庫(摘錄)所示,它包含的是說明、解釋型信息。第一列為MF號,第二列為MT號,第三列為該MT號下的截面數(shù)據(jù)占多少行。
其中,其對應的反應截面數(shù)據(jù)如下圖2-2 钚元素與光子相互作用截面數(shù)據(jù)庫所示,從左至右第1、3、5列為能量點,即下圖中方框所示,第2、4、6列分別為1、3、5列的能量點對應的截面數(shù)據(jù),即下圖中橢圓所示。
通過分析數(shù)據(jù)的存儲格式和目標數(shù)據(jù)與非目標數(shù)據(jù)的差異,發(fā)現(xiàn)目標數(shù)據(jù)在去除符號后,均為數(shù)字格式,所以首先對當前行數(shù)據(jù)進行預處理:去除當前行字符串中的符號元素。然后嘗試將字符串格式轉換為float數(shù)據(jù)類型,當轉換失敗,觸發(fā)異常,則說明當前行數(shù)據(jù)不是目標數(shù)據(jù),則繼續(xù)遍歷處理下一行,如圖2-3所示。
2.3、目標數(shù)據(jù)行數(shù)據(jù)解析
解析MAT、MF、MT數(shù)據(jù):MF號和MT號組合是倒數(shù)第二列,MAT號是倒數(shù)第三列,并且 MT就是3位,但是也可能會出現(xiàn)MAT號與MF和MT號粘連且與第六列的數(shù)據(jù)也粘連(如圖2-4所示)或者僅MAT號與MF和MT號粘連(如圖2-5所示)的現(xiàn)象。當MAT號與MF和MT號粘連且與第六列的數(shù)據(jù)也粘連時,共占字符大于9,其中MT號占最后三個字符,MF號占倒數(shù)第五至第三的字符,MAT占倒數(shù)第九至第五的字符;當僅MAT號與MF和MT號粘連時,第二列為MF和MT號共占字符數(shù)大于等于5,其中MT號占最后三個字符,MF號占倒數(shù)5至3位的字符,MAT號占倒數(shù)0至5位;當MAT號與MF和MT號不粘連時(如圖2-6所示),MAT為倒數(shù)第三列,MF和MT為倒數(shù)第二列,其中MT占后面三位,MF占前面兩位。因此,目標數(shù)據(jù)行數(shù)據(jù)解析如圖2-7所示。
因為我們所需要的數(shù)據(jù)只有文件中每一行的前六個數(shù)據(jù),后面的數(shù)據(jù)為說明語句,因此對前六個數(shù)據(jù)進行拆分。由于第六列數(shù)據(jù)可能會出現(xiàn)與第七列說明語句粘連的現(xiàn)象,所以,按照“ ”進行分割后,對于前5個數(shù)據(jù),直接判斷為需要的數(shù)據(jù),對于第6個數(shù)據(jù),當其長度小于等于10,直接判斷為需要的數(shù)據(jù)。當其第一位為“-”,且長度為11,直接判斷為需要的數(shù)據(jù)。當?shù)谝晃粸椤?”且長度大于11,則在第11位處進行分割。當?shù)谝晃徊皇恰?”,且位數(shù)大于10,則再第10位進行分割。
一行六個數(shù)據(jù),分為三組(能量點--對應截面),存儲時是將能量點與對應的截面同時存放,每一行三組數(shù)據(jù),即存放三次。因為能量為0的粒子是不存在的,所以應該舍去能量點為0的對應數(shù)據(jù),即去除異常元素。
在存放時,需要判斷“energy”是否為0,當“energy”不為零時,則將“energy”和對應的截面數(shù)據(jù)存放在數(shù)據(jù)庫。
2.4、數(shù)據(jù)入庫
為了保證數(shù)據(jù)元素的純凈,首先需要檢測將要被創(chuàng)建的數(shù)據(jù)庫文件是否已經(jīng)存在,如果不存在,則創(chuàng)建數(shù)據(jù)庫文件,如果存在,則刪除原來的數(shù)據(jù)庫文件。
在創(chuàng)建數(shù)據(jù)庫后,數(shù)據(jù)庫需要初始化:即創(chuàng)建表,如圖2-8所示。
當對數(shù)據(jù)庫的表創(chuàng)建完畢后,即實現(xiàn)了創(chuàng)建相應數(shù)據(jù)庫的操作,此時當前目錄下可以找到對應的數(shù)據(jù)庫文件,然后插入數(shù)據(jù)。
2.5、數(shù)據(jù)處理
在將數(shù)據(jù)轉變成string變量時,數(shù)據(jù)末尾可能會出現(xiàn)多個0,為了數(shù)據(jù)的直觀和美觀,將末尾多余的0去除。在數(shù)據(jù)轉成string變量后,查找nRet中的“.”位置,然后記錄nRet的長度。然后判斷數(shù)據(jù)是否為小數(shù),nPosPoint=1則說明nRet中沒有“.”,可以直接存儲;nPosNotZero>1則說明nRet中有“.”,可能需要尾綴去零處理。
利用倒敘循環(huán)遍歷nRet中小數(shù)點后從左至右連續(xù)的零的情況,即從右至左到小數(shù)點后一位依次判斷該位是否為零。參考代碼如下:
for i in range(nLen-1, nPosPoint-1, -1):
if nRet[i] != "0":
nPosNotZero = i
Break
2.6、查詢和確認數(shù)據(jù)
最后可以導入sqlite3模塊,然后連接數(shù)據(jù)庫利用sql語句查詢和確認數(shù)據(jù)入庫的情況。
3、結束語
本文的數(shù)據(jù)存儲過程適用于文本數(shù)據(jù)的存儲,以實現(xiàn)數(shù)據(jù)共享、減少數(shù)據(jù)的冗余度、同時保持數(shù)據(jù)的獨立性、實現(xiàn)數(shù)據(jù)集中控制,并確保數(shù)據(jù)的一致性和可維護性。
【參考文獻】:
[1]Python操作SQLite數(shù)據(jù)庫[J].朱純陽.計算機軟件與計算機應用.2015(15)
[2]淺談SQLite數(shù)據(jù)庫技術在Android平臺的應用,[J].唐磊.計算機軟件與計算機應用.2014(09)