基于Python的SQLite数据库存储

2020-11-20 02:05张小凤高正明
装备维修技术 2020年5期
关键词:数据存储

张小凤 高正明

摘要:本文主要论述了基于python的SQLite数据库数据存储原理、过程和用途。具体以SQLite3为例,将文本数据存储的过程进行了阐述和说明。

关键词:反应截面、Python、数据存储、SQLite

引言:

在科研学习过程中,为了防止数据被反复抓取,我们通常需要运用Python代码从网站上爬取相关数据,则需要将数据保存到本地,其中最常用的方式就是将数据按照设计的数据格式保存到指定的文件中,其中常用的数据类型为文本文档txt、表格类文件csv、 excel 等。此外,还可以将数据存储到数据库(例如SQLite3、MySQL等)中,以便能够便捷读取及管理数据。

SQLite相比于其他数据库,其不需要单独的进行安装或者管理服务,即不需要配置,只需要程序调用即可,不要求为该数据库生成一个单独的服务器进程且不需要为其单独配置可操作的系统,及不需要配置服务器;其次,SQLite数据库的存储文件相比于其他存储文件,其占用磁盘的空间很小,属于轻量级的文件,且可以在多个跨平台的系统中进行使用和处理,即该文件不依赖多余的硬件或者软件配置,就可以实现自给自足;另外,对于ACID,SQLite数据库的访问和设置均是完全兼容的,即对于同一个SQLite数据库文件而言,它容许多个程序或者程序进程、线程进行安全管理访问;除此之外,SQLite采用的是 ANSI-C 进行编辑的,同时为了能够更方便于用户操作,它提供了简洁明了的API,同时为了方便用户查询数据库的信息,SQL92(SQL2)标准中大部分的查询功能均被支持使用。

因为Python 2.5x及以上的版本均内置了SQLite3数据库引擎,因此直接输入命令“import sqlite3”即可使用。鉴于SQLite3和Python相结合的优点,本文主要阐述如何利用Python将文本数据录入SQLite3数据库。

1、python的操作步骤

① 首先创建一个与数据库文件的连接对象connection,即利用sqlite3.open(),函数;

② 其次创建光标对象cursor,即利用connection.cursor()函数;

③ 然后使SQL语句将会被执行,利用cursor.execute()函数;

④ 再利用connection.commit()函数提交当前事务,或利用cursor.fetchall(),获得查询结果;

⑤ 最后将与数据库文件的连接关闭,即利用connection.close()。

2、具体步骤

2.1、逐行读取指定路径下文件的文件内容

通过采用with语句和open语句的结合,可以安全地实现对文件的打开操作,并利用readlines()函数以便对文件的每行内容进行快速便捷读取,即对all的数据进行拆分。

with open("eedl.all") as f:

text = f.readlines()

2.2、对数据进行解析,判断当前行是不是目标数据行

文件包含说明信息和反应截面数据,如下图2-1 钚元素与光子的相互作用截面数据库(摘录)所示,它包含的是说明、解释型信息。第一列为MF号,第二列为MT号,第三列为该MT号下的截面数据占多少行。

其中,其对应的反应截面数据如下图2-2 钚元素与光子相互作用截面数据库所示,从左至右第1、3、5列为能量点,即下图中方框所示,第2、4、6列分别为1、3、5列的能量点对应的截面数据,即下图中椭圆所示。

通过分析数据的存储格式和目标数据与非目标数据的差异,发现目标数据在去除符号后,均为数字格式,所以首先对当前行数据进行预处理:去除当前行字符串中的符号元素。然后尝试将字符串格式转换为float数据类型,当转换失败,触发异常,则说明当前行数据不是目标数据,则继续遍历处理下一行,如图2-3所示。

2.3、目标数据行数据解析

解析MAT、MF、MT数据:MF号和MT号组合是倒数第二列,MAT号是倒数第三列,并且 MT就是3位,但是也可能会出现MAT号与MF和MT号粘连且与第六列的数据也粘连(如图2-4所示)或者仅MAT号与MF和MT号粘连(如图2-5所示)的现象。当MAT号与MF和MT号粘连且与第六列的数据也粘连时,共占字符大于9,其中MT号占最后三个字符,MF号占倒数第五至第三的字符,MAT占倒数第九至第五的字符;当仅MAT号与MF和MT号粘连时,第二列为MF和MT号共占字符数大于等于5,其中MT号占最后三个字符,MF号占倒数5至3位的字符,MAT号占倒数0至5位;当MAT号与MF和MT号不粘连时(如图2-6所示),MAT为倒数第三列,MF和MT为倒数第二列,其中MT占后面三位,MF占前面两位。因此,目标数据行数据解析如图2-7所示。

因为我们所需要的数据只有文件中每一行的前六个数据,后面的数据为说明语句,因此对前六个数据进行拆分。由于第六列数据可能会出现与第七列说明语句粘连的现象,所以,按照“ ”进行分割后,对于前5个数据,直接判断为需要的数据,对于第6个数据,当其长度小于等于10,直接判断为需要的数据。当其第一位为“-”,且长度为11,直接判断为需要的数据。当第一位为“-”且长度大于11,则在第11位处进行分割。当第一位不是“-”,且位数大于10,则再第10位进行分割。

一行六个数据,分为三组(能量点--对应截面),存储时是将能量点与对应的截面同时存放,每一行三组数据,即存放三次。因为能量为0的粒子是不存在的,所以应该舍去能量点为0的对应数据,即去除异常元素。

在存放时,需要判断“energy”是否为0,当“energy”不为零时,则将“energy”和对应的截面数据存放在数据库。

2.4、数据入库

为了保证数据元素的纯净,首先需要检测将要被创建的数据库文件是否已经存在,如果不存在,则创建数据库文件,如果存在,则删除原来的数据库文件。

在创建数据库后,数据库需要初始化:即创建表,如图2-8所示。

当对数据库的表创建完毕后,即实现了创建相应数据库的操作,此时当前目录下可以找到对应的数据库文件,然后插入数据。

2.5、数据处理

在将数据转变成string变量时,数据末尾可能会出现多个0,为了数据的直观和美观,将末尾多余的0去除。在数据转成string变量后,查找nRet中的“.”位置,然后记录nRet的长度。然后判断数据是否为小数,nPosPoint=1则说明nRet中没有“.”,可以直接存储;nPosNotZero>1则说明nRet中有“.”,可能需要尾缀去零处理。

利用倒叙循环遍历nRet中小数点后从左至右连续的零的情况,即从右至左到小数点后一位依次判断该位是否为零。参考代码如下:

for i in range(nLen-1, nPosPoint-1, -1):

if nRet[i] != "0":

nPosNotZero = i

Break

2.6、查询和确认数据

最后可以导入sqlite3模块,然后连接数据库利用sql語句查询和确认数据入库的情况。

3、结束语

本文的数据存储过程适用于文本数据的存储,以实现数据共享、减少数据的冗余度、同时保持数据的独立性、实现数据集中控制,并确保数据的一致性和可维护性。

【参考文献】:

[1]Python操作SQLite数据库[J].朱纯阳.计算机软件与计算机应用.2015(15)

[2]浅谈SQLite数据库技术在Android平台的应用,[J].唐磊.计算机软件与计算机应用.2014(09)

猜你喜欢
数据存储
大数据时代档案信息建设的认识和实践
开源数据库数据存储的实现路径分析
基于Android开发的APP数据存储研究
哈希算法在物联网数据存储中的应用
大型在线式UPS及监控系统在中控机房的应用