[转载] Python3 使用 SQLite3 数据库的操作笔记:批量插入

参考链接: 使用Python将变量插入数据库表

目的 

要把很多个文本文件的内容(固定格式),批量导入到数据库,方便以后查询。 

前言 

刚接触 Python,把自己的心得分享给大家 

 

 电脑系统:Win7 X64 代码编辑器:Visual Studio Code,扩展中安装 Python Python版本:3.8.4,当中已经集成 SQLite3,不用另外安装 

 

测试文本文件:a1.txt,a2.txt 格式如下: 

a1.txt

A1001,zhangyi

A1002,zhanger

A1003,zhangsan

 

a2.txt

A2001,liliyi

A2002,lilier

A2003,lilisan

 

思路 

循环文件夹内所有文本文件文本文件内容转换为数据库需要的格式,且放到列表变量中把列表变量数据插入到数据库 

编程 

经多次测试发现,下面这种方式处理效率最高: 

import sqlite3, glob, time

 

Dir0=input('请输入文件所在的文件夹(格式 c: 或 c:/abc):')

# 查找输入的文件夹下所有 .txt 文件,不包含子文件夹

Dir1=glob.glob(Dir0+r'/*.txt') 

 

Int0=len(Dir1)  # 总文件数

if Int0 == 0:

    print(Dir0,'目录下没有所需文件')

 

# 数据库连接

conn = sqlite3.connect('z:\\1.db')

# 创建一个表 p (判断表是否存在,不存在就创建一个)

conn.execute('CREATE TABLE IF NOT EXISTS p (ID CHAR(50),Name CHAR(50))')

 

Int1=0  # 打开第几个文件

 

for Row0 in Dir1:

    

    # 计时开始,用于查看处理文件所需时间

    start = time.perf_counter()

 

    # 列表变量要先设定

    List0=[]

 

    Int2=0  # 文本总行数

    Int1 += 1

    

    print('总文件数:',Int0 ,'  正在打开第',Int1 ,'个文件。  文件名:',Row0)

    File0 = open(Row0) # 打开文本文件

 

    for Row1 in File0.readlines() :

 

        # 根据文本格式,查找 ',' 逗号所在字符串位置

        Int10=Row1.find(',')

        # 取逗号左面字符串

        Str1=Row1[:Int10]

        # 取逗号右面字符串,文本文件内每行字符串后有一个换行符,所以要 -1

        Str2=Row1[Int10+1:len(Row1)-1]

 

        Str0 = Str1,Str2

        List0.append(Str0) # 列表变量添加新数据

 

        Int2 +=1

 

    File0.close() # 关闭文本文件

    

    print ('处理文本用时:', time.perf_counter() - start)

    print ('文本行数 =',Int2)

 

    # 往表中插入数据。conn.executemany 可以一次插入多行数据。

    # conn.execute 每次只能插入一行数据,且要放入循环内,效率低得多

    conn.executemany('INSERT INTO p (ID,Name) VALUES (?,?)',(List0))

 

    conn.commit()  #事物完结

    

    print ('插入数据用时:', time.perf_counter() - start)

 

    Rs1 = conn.execute("SELECT count(*) from p")

    print('表总行数 =',Rs1.fetchone()[0])

 

    print('')

 

Rs2 = conn.execute("SELECT ID,Name from p")

for Row2 in Rs2:

    print ("ID = ", Row2[0])

    print ("Name= ", Row2[1])

    

conn.close()

 

结果如下: 

请输入文件所在的文件夹(格式 c: 或 c:/abc):z:

总文件数: 2   正在打开第 1 个文件。  文件名: z:/a1.txt

处理文本用时: 0.005185218999999908

文本行数 = 3

插入数据用时: 0.014957353000000229

表总行数 = 3

 

总文件数: 2   正在打开第 2 个文件。  文件名: z:/a2.txt

处理文本用时: 0.0011917829999998908

文本行数 = 3

插入数据用时: 0.010902635999999966

表总行数 = 6

 

ID =  A1001

Name=  zhangyi

ID =  A1002

Name=  zhanger

ID =  A1003

Name=  zhangsan

ID =  A2001

Name=  liliyi

ID =  A2002

Name=  lilier

ID =  A2003

Name=  lilisa

 

结束 

实际使用中,插入100万条数据,运行效率还算满意 

请输入文件所在的文件夹(格式 c: 或 c:/abc):d:

总文件数: 2   正在打开第 1 个文件。  文件名: d:\1.txt

处理文本用时: 0.724840726

文本行数 = 559103

插入数据用时: 3.0582557649999984

表总行数 = 559103

 

总文件数: 2   正在打开第 2 个文件。  文件名: d:\2.txt

处理文本用时: 0.7421396850000015

文本行数 = 559103

插入数据用时: 3.5078366950000017

表总行数 = 1118206

你可能感兴趣的:([转载] Python3 使用 SQLite3 数据库的操作笔记:批量插入)