参考链接: 使用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