Python實現讀取TXT檔案資料並存進內建資料庫SQLite3的方法,

來源:互聯網
上載者:User

Python實現讀取TXT檔案資料並存進內建資料庫SQLite3的方法,

本文執行個體講述了Python實現讀取TXT檔案資料並存進內建資料庫SQLite3的方法。分享給大家供大家參考,具體如下:

當TXT檔案太大,電腦記憶體不夠時,我們可以選擇按行讀取TXT檔案,並將其儲存進Python內建輕量級splite資料庫,這樣可以加快資料的讀取速度,當我們需要重複讀取資料時,這樣的速度加快所帶來的時間節省是非常可觀的,比如,當我們在訓練資料時,要迭代10萬次,即要從檔案中讀取10萬次,即使每次只加快0.1秒,那麼也能節省幾個小時的時間了。

#建立資料庫並把txt檔案的資料存進資料庫import sqlite3      #匯入sqlite3cx = 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 = 0for line in fr.readlines():    #將資料按行插入資料庫的表train4中。  cu.execute('insert into train4 values(?,?)',(i,line))  i +=1cu.close()   #關閉遊標cx.commit()   #事務提交cx.close()   #關閉資料庫

查詢資料:

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

註:如果前面已經關閉了資料庫,那麼在查詢時要重新開啟資料庫,並建立遊標。這一點要注意一下。

完整的查詢程式是這樣的:

import sqlite3cx = 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 fieldsdef _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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.