Python实现读取TXT文件数据并存进内置数据库SQLite3的方法


Posted in Python onAugust 08, 2017

本文实例讲述了Python实现读取TXT文件数据并存进内置数据库SQLite3的方法。分享给大家供大家参考,具体如下:

当TXT文件太大,计算机内存不够时,我们可以选择按行读取TXT文件,并将其存储进Python内置轻量级splite数据库,这样可以加快数据的读取速度,当我们需要重复读取数据时,这样的速度加快所带来的时间节省是非常可观的,比如,当我们在训练数据时,要迭代10万次,即要从文件中读取10万次,即使每次只加快0.1秒,那么也能节省几个小时的时间了。

#创建数据库并把txt文件的数据存进数据库
import sqlite3      #导入sqlite3
cx = sqlite3.connect('./train.db')  #创建数据库,如果数据库已经存在,则链接数据库;如果数据库不存在,则先创建数据库,再链接该数据库。
cu = cx.cursor()           #定义一个游标,以便获得查询对象。
cu.execute('create table if not exists train4 (id integer primary key,name text)')  #创建表
fr = open('data_sample.txt')    #打开要读取的txt文件
i = 0
for line in fr.readlines():    #将数据按行插入数据库的表train4中。
  cu.execute('insert into train4 values(?,?)',(i,line))
  i +=1
cu.close()   #关闭游标
cx.commit()   #事务提交
cx.close()   #关闭数据库

查询数据:

cu.execute('select * from train4 where id = ?',(i,)) #i代表你要读取表train4中某一行的数据
result = cu.fetchall()

注:如果前面已经关闭了数据库,那么在查询时要重新打开数据库,并创建游标。这一点要注意一下。

完整的查询程序是这样的:

import sqlite3
cx = sqlite3.connect('./train.db')
cu = cx.cursor()
for i in range(5):
  cu.execute('select * from train4 where id = ?',(i,))
  result = cu.fetchall()
  cx.commit()
cu.close()
cx.close()

另:这里再为大家附带一个SQLite3数据操作类供大家参考使用:

import sqlite3
# ***************************************************
# *
# * Description: Python操作SQLite3数据库辅助类(查询构造器)
# * Author: wangye
# *
# ***************************************************
def _wrap_value(value):
  return repr(value)
def _wrap_values(values):
  return list(map(_wrap_value, values))
def _wrap_fields(fields):
  for key,value in fields.items():
    fields[key] = _wrap_value(value)
  return fields
def _concat_keys(keys):
  return "[" + "],[".join(keys) + "]"
def _concat_values(values):
  return ",".join(values)
def _concat_fields(fields, operator = (None, ",")):
  if operator:
    unit_operator, group_operator = operator
  # fields = _wrap_fields(fields)
  compiled = []
  for key,value in fields.items():
    compiled.append("[" + key + "]")
    if unit_operator:
      compiled.append(unit_operator)
      compiled.append(value)
    compiled.append(group_operator)
  compiled.pop() # pop last group_operator
  return " ".join(compiled)
class DataCondition(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>26 OR age>35)
      DataCondition(("LIKE", "OR"), False, name = "John", company = "Google")
      name LIKE 'John' OR company LIKE "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)
    if self.ingroup:
      return "(" + result + ")"
    return result
  def __str__(self):
    return self.__unicode__()
  def toString(self):
    return self.__unicode__()
class DataHelper(object):
  """
    SQLite3 数据查询辅助类
  """
  def __init__(self, filename):
    """
      构造方法
      参数: filename 为SQLite3 数据库文件名
    """
    self.file_name = filename
  def open(self):
    """
      打开数据库并设置游标
    """
    self.connection = sqlite3.connect(self.file_name)
    self.cursor = self.connection.cursor()
    return self
  def close(self):
    """
      关闭数据库,注意若不显式调用此方法,
      在类被回收时也会尝试调用
    """
    if hasattr(self, "connection") and self.connection:
      self.connection.close()
  def __del__(self):
    """
      析构方法,做一些清理工作
    """
    self.close()
  def commit(self):
    """
      提交事务
      SELECT语句不需要此操作,默认的execute方法的
      commit_at_once设为True会隐式调用此方法,
      否则就需要显示调用本方法。
    """
    self.connection.commit()
  def execute(self, sql = None, commit_at_once = True):
    """
      执行SQL语句
      参数:
        sql 要执行的SQL语句,若为None,则调用构造器生成的SQL语句。
        commit_at_once 是否立即提交事务,如果不立即提交,
        对于非查询操作,则需要调用commit显式提交。
    """
    if not sql:
      sql = self.sql
    self.cursor.execute(sql)
    if commit_at_once:
      self.commit()
  def fetchone(self, sql = None):
    """
      取一条记录
    """
    self.execute(sql, False)
    return self.cursor.fetchone()
  def fetchall(self, sql = None):
    """
      取所有记录
    """
    self.execute(sql, False)
    return self.cursor.fetchall()
  def __concat_keys(self, keys):
    return _concat_keys(keys)
  def __concat_values(self, values):
    return _concat_values(values)
  def table(self, *args):
    """
      设置查询的表,多个表名用逗号分隔
    """
    self.tables = args
    self.tables_snippet = self.__concat_keys(self.tables)
    return self
  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
    if hasattr(self, "condition_snippet"):
      self.where_snippet = " WHERE " + self.condition_snippet
  def __select(self):
    template = "SELECT %(keys)s FROM %(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 = "INSERT INTO %(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)s SET %(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 = "DELETE FROM %(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):
    return self.sql
  def __str__(self):
    return self.__unicode__()
  def select(self, *args):
    self.current_token = "SELECT"
    self.body_keys = args
    self.__build()
    return self
  def insert(self, **kwargs):
    self.current_token = "INSERT"
    self.body_fields = self.__wrap_fields(kwargs)
    self.__build()
    return self
  def update(self, **kwargs):
    self.current_token = "UPDATE"
    self.body_fields = self.__wrap_fields(kwargs)
    self.__build()
    return self
  def delete(self, *conditions):
    self.current_token = "DELETE"
    self.__build()
    #if *conditions:
    self.where(*conditions)
    return self
  def where(self, *conditions):
    conditions = list(map(str, conditions))
    self.condition_snippet = " AND ".join(conditions)
    self.__where()
    if hasattr(self, "where_snippet"):
      self.sql += self.where_snippet
    return self

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python原始字符串与Unicode字符串操作符用法实例分析
Jul 22 Python
Python利用ElementTree模块处理XML的方法详解
Aug 31 Python
Django 实现下载文件功能的示例
Mar 06 Python
使用pandas中的DataFrame数据绘制柱状图的方法
Apr 10 Python
python获取交互式ssh shell的方法
Feb 14 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
Feb 16 Python
python机器学习库scikit-learn:SVR的基本应用
Jun 26 Python
Python flask框架post接口调用示例
Jul 03 Python
利用Python检测URL状态
Jul 31 Python
Python3从零开始搭建一个语音对话机器人的实现
Aug 23 Python
python except异常处理之后不退出,解决异常继续执行的实现
Apr 25 Python
python爬取youtube视频的示例代码
Mar 03 Python
Python3 适合初学者学习的银行账户登录系统实例
Aug 08 #Python
Python初学时购物车程序练习实例(推荐)
Aug 08 #Python
Python爬虫之xlml解析库(全面了解)
Aug 08 #Python
Python 3中print函数的使用方法总结
Aug 08 #Python
Python读取sqlite数据库文件的方法分析
Aug 07 #Python
Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
Aug 07 #Python
django实现前后台交互实例
Aug 07 #Python
You might like
Protoss魔法科技
2020/03/14 星际争霸
《Re:从零开始的异世界生活》剧情体验,手游新作定名
2020/04/09 日漫
Content-type 的说明
2006/10/09 PHP
PHP删除HTMl标签的实现代码
2013/06/30 PHP
PHP小教程之实现链表
2014/06/09 PHP
PHP7 echo和print语句实例用法
2019/02/15 PHP
关于Blog顶部的滚动导航条代码
2006/09/25 Javascript
用js实现键盘方向键翻页功能的代码
2007/06/03 Javascript
javascript下function声明一些小结
2007/12/28 Javascript
jQuery 判断元素上是否绑定了事件
2009/10/28 Javascript
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
2013/12/12 Javascript
Jquery实现的角色左右选择特效
2014/05/21 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
2014/06/19 Javascript
Node.js中调用mysql存储过程示例
2014/12/20 Javascript
jquery分割字符串的方法
2015/06/24 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
javascript函数的四种调用模式
2017/01/08 Javascript
浅析Node.js非对称加密方法
2018/01/29 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
2018/09/04 Javascript
[01:03:56]Mineski vs TNC 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
Python subprocess模块常见用法分析
2018/06/12 Python
python3.6.3转化为win-exe文件发布的方法
2018/10/31 Python
对python中的six.moves模块的下载函数urlretrieve详解
2018/12/19 Python
python 实现分页显示从es中获取的数据方法
2018/12/26 Python
python 图像处理画一个正弦函数代码实例
2019/09/10 Python
Python数据可视化:泊松分布详解
2019/12/07 Python
详解python opencv、scikit-image和PIL图像处理库比较
2019/12/26 Python
Python实现树莓派摄像头持续录像并传送到主机的步骤
2020/11/30 Python
Canvas 文字碰撞检测并抽稀的方法
2019/05/27 HTML / CSS
写clone()方法时,通常都有一行代码,是什么?
2012/10/31 面试题
取保候审保证书
2014/04/30 职场文书
城管大队整治方案
2014/05/06 职场文书
社区志愿者培训方案
2014/06/10 职场文书
创先争优个人承诺书
2014/08/30 职场文书
大学生旷课检讨书1000字
2015/02/19 职场文书
2015年高中生国庆节演讲稿
2015/07/30 职场文书