Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
本文实例讲述了Python实现读取TXT文件数据并存进内置数据库SQLite3的方法。分享给大家供大家参考,具体如下:
当TXT文件太大,计算机内存不够时,我们可以选择按行读取TXT文件,并将其存储进Python内置轻量级splite数据库,这样可以加快数据的读取速度,当我们需要重复读取数据时,这样的速度加快所带来的时间节省是非常可观的,比如,当我们在训练数据时,要迭代10万次,即要从文件中读取10万次,即使每次只加快0.1秒,那么也能节省几个小时的时间了。
#创建数据库并把txt文件的数据存进数据库
importsqlite3#导入sqlite3
cx=sqlite3.connect('./train.db')#创建数据库,如果数据库已经存在,则链接数据库;如果数据库不存在,则先创建数据库,再链接该数据库。
cu=cx.cursor()#定义一个游标,以便获得查询对象。
cu.execute('createtableifnotexiststrain4(idintegerprimarykey,nametext)')#创建表
fr=open('data_sample.txt')#打开要读取的txt文件
i=0
forlineinfr.readlines():#将数据按行插入数据库的表train4中。
cu.execute('insertintotrain4values(?,?)',(i,line))
i+=1
cu.close()#关闭游标
cx.commit()#事务提交
cx.close()#关闭数据库
查询数据:
cu.execute('select*fromtrain4whereid=?',(i,))#i代表你要读取表train4中某一行的数据
result=cu.fetchall()
注:如果前面已经关闭了数据库,那么在查询时要重新打开数据库,并创建游标。这一点要注意一下。
完整的查询程序是这样的:
importsqlite3
cx=sqlite3.connect('./train.db')
cu=cx.cursor()
foriinrange(5):
cu.execute('select*fromtrain4whereid=?',(i,))
result=cu.fetchall()
cx.commit()
cu.close()
cx.close()
另:这里再为大家附带一个SQLite3数据操作类供大家参考使用:
importsqlite3
#***************************************************
#*
#*Description:Python操作SQLite3数据库辅助类(查询构造器)
#*Author:wangye
#*
#***************************************************
def_wrap_value(value):
returnrepr(value)
def_wrap_values(values):
returnlist(map(_wrap_value,values))
def_wrap_fields(fields):
forkey,valueinfields.items():
fields[key]=_wrap_value(value)
returnfields
def_concat_keys(keys):
return"["+"],[".join(keys)+"]"
def_concat_values(values):
return",".join(values)
def_concat_fields(fields,operator=(None,",")):
ifoperator:
unit_operator,group_operator=operator
#fields=_wrap_fields(fields)
compiled=[]
forkey,valueinfields.items():
compiled.append("["+key+"]")
ifunit_operator:
compiled.append(unit_operator)
compiled.append(value)
compiled.append(group_operator)
compiled.pop()#poplastgroup_operator
return"".join(compiled)
classDataCondition(object):
"""
本类用于操作SQL构造器辅助类的条件语句部分
例如:
DataCondition(("=","AND"),id=26)
DataCondition(("=","AND"),True,id=26)
"""
def__init__(self,operator=("=","AND"),ingroup=True,**kwargs):
"""
构造方法
参数:
operator操作符,分为(表达式操作符,条件运算符)
ingroup是否分组,如果分组,将以括号包含
kwargs键值元组,包含数据库表的列名以及值
注意这里的等于号不等于实际生成SQL语句符号
实际符号是由operator[0]控制的
例如:
DataCondition(("=","AND"),id=26)
(id=26)
DataCondition((">","OR"),id=26,age=35)
(id>26ORage>35)
DataCondition(("LIKE","OR"),False,name="John",company="Google")
nameLIKE'John'ORcompanyLIKE"Google"
"""
self.ingroup=ingroup
self.fields=kwargs
self.operator=operator
def__unicode__(self):
self.fields=_wrap_fields(self.fields)
result=_concat_fields(self.fields,self.operator)
ifself.ingroup:
return"("+result+")"
returnresult
def__str__(self):
returnself.__unicode__()
deftoString(self):
returnself.__unicode__()
classDataHelper(object):
"""
SQLite3数据查询辅助类
"""
def__init__(self,filename):
"""
构造方法
参数:filename为SQLite3数据库文件名
"""
self.file_name=filename
defopen(self):
"""
打开数据库并设置游标
"""
self.connection=sqlite3.connect(self.file_name)
self.cursor=self.connection.cursor()
returnself
defclose(self):
"""
关闭数据库,注意若不显式调用此方法,
在类被回收时也会尝试调用
"""
ifhasattr(self,"connection")andself.connection:
self.connection.close()
def__del__(self):
"""
析构方法,做一些清理工作
"""
self.close()
defcommit(self):
"""
提交事务
SELECT语句不需要此操作,默认的execute方法的
commit_at_once设为True会隐式调用此方法,
否则就需要显示调用本方法。
"""
self.connection.commit()
defexecute(self,sql=None,commit_at_once=True):
"""
执行SQL语句
参数:
sql要执行的SQL语句,若为None,则调用构造器生成的SQL语句。
commit_at_once是否立即提交事务,如果不立即提交,
对于非查询操作,则需要调用commit显式提交。
"""
ifnotsql:
sql=self.sql
self.cursor.execute(sql)
ifcommit_at_once:
self.commit()
deffetchone(self,sql=None):
"""
取一条记录
"""
self.execute(sql,False)
returnself.cursor.fetchone()
deffetchall(self,sql=None):
"""
取所有记录
"""
self.execute(sql,False)
returnself.cursor.fetchall()
def__concat_keys(self,keys):
return_concat_keys(keys)
def__concat_values(self,values):
return_concat_values(values)
deftable(self,*args):
"""
设置查询的表,多个表名用逗号分隔
"""
self.tables=args
self.tables_snippet=self.__concat_keys(self.tables)
returnself
def__wrap_value(self,value):
return_wrap_value(value)
def__wrap_values(self,values):
return_wrap_values(values)
def__wrap_fields(self,fields):
return_wrap_fields(fields)
def__where(self):
#self.condition_snippet
ifhasattr(self,"condition_snippet"):
self.where_snippet="WHERE"+self.condition_snippet
def__select(self):
template="SELECT%(keys)sFROM%(tables)s"
body_snippet_fields={
"tables":self.tables_snippet,
"keys":self.__concat_keys(self.body_keys),
}
self.sql=template%body_snippet_fields
def__insert(self):
template="INSERTINTO%(tables)s(%(keys)s)VALUES(%(values)s)"
body_snippet_fields={
"tables":self.tables_snippet,
"keys":self.__concat_keys(list(self.body_fields.keys())),
"values":self.__concat_values(list(self.body_fields.values()))
}
self.sql=template%body_snippet_fields
def__update(self):
template="UPDATE%(tables)sSET%(fields)s"
body_snippet_fields={
"tables":self.tables_snippet,
"fields":_concat_fields(self.body_fields,("=",","))
}
self.sql=template%body_snippet_fields
def__delete(self):
template="DELETEFROM%(tables)s"
body_snippet_fields={
"tables":self.tables_snippet
}
self.sql=template%body_snippet_fields
def__build(self):
{
"SELECT":self.__select,
"INSERT":self.__insert,
"UPDATE":self.__update,
"DELETE":self.__delete
}[self.current_token]()
def__unicode__(self):
returnself.sql
def__str__(self):
returnself.__unicode__()
defselect(self,*args):
self.current_token="SELECT"
self.body_keys=args
self.__build()
returnself
definsert(self,**kwargs):
self.current_token="INSERT"
self.body_fields=self.__wrap_fields(kwargs)
self.__build()
returnself
defupdate(self,**kwargs):
self.current_token="UPDATE"
self.body_fields=self.__wrap_fields(kwargs)
self.__build()
returnself
defdelete(self,*conditions):
self.current_token="DELETE"
self.__build()
#if*conditions:
self.where(*conditions)
returnself
defwhere(self,*conditions):
conditions=list(map(str,conditions))
self.condition_snippet="AND".join(conditions)
self.__where()
ifhasattr(self,"where_snippet"):
self.sql+=self.where_snippet
returnself
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python操作SQLite数据库技巧总结》、《Python常见数据库操作技巧汇总》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。