欢迎光临全网营销网站

收藏!Python内置的轻量级数据库竟如此好用!全网最实用sqlite3实战项目。

作者:jcmp      发布时间:2021-04-28      浏览量:0
前段时间推送了一篇Python操作MyS

前段时间推送了一篇Python操作MySQL数据库的文章: 我用 Python 处理3万多条数据,只要几秒钟…… ,文章发布后反应很好,很多粉丝给我私信,有的朋友说:MySQL安装起来太麻烦了,有没有更简便的方法?

肯定是有的!Python内置的sqlite3模块是一个轻量级的数据库,不需要独立的服务器进程。它的数据库就是一个 .db 后缀的文件,可以跨平台直接访问,非常便捷。简直就是轻量级数据的首选数据库啊!

1. 读取数据并插入数据库

程序设计思路 :自动读取每个TXT文件,再依次读取每一行并插入数据库中。

1.1 源代码

1.2 运行效果

1.3 重点代码解释

1)自动获取所有TXT文件名称和路径

了解我的读者都知道,我是比较懒的,我不喜欢指定程序的路径。我写的程序都是自己找路径,自己找文件名称。感兴趣的朋友可以去我的公众号(智能演示)查看这篇文章: 获取任意路径下文件名称的2种方法 。

2)数据库的创建与连接

conn = sqlite3.connect(path+'\db.db')。

path 是程序所在路径,也是TXT文件的所在路径。这行代码的意思是:如果数据库已经存在,则连接数据库;如果数据库不存在,则先创建数据库,再连接该数据库。

3)创建表

cur.execute('create table if not exists numbers (id integer primary key ,number varchar(20) NOT NULL)')。

在数据库 db.db 中创建表 numbers ,表中包含两个字段:id、number。

注意!一定不要忘了 conn.commit() 保存一下!不然后面的数据是插不进去的。

4)插入数据

①优化打开方式

with open(file,'r',encoding = 'UTF-8') as f:

建议使用 with 语句来打开TXT文件。这样做的好处是,当对象会在with语句结束时会自动关闭。效率更高!不易出错。

②占位符功能

cur.execute('insert into numbers values(?,?)',(i,line))。

(?,?) 起到占位符功能, (i,line)) 中的值会按位置替换到SQL语句中。

这样就实现了数据的自动插入数据库。需要几分钟时间,请耐心等待。

我们查看下 db.db 文件属性,可以看到存储了51216条数据的数据库文件大小只有1.13MB,可以说是很轻量的。

下面就来说一下sqlite3的常用操作。

2. 数据库操作

2.1 连接数据库

import sqlite3import ospath = os.getcwd()files = os.listdir(path)conn = sqlite3.connect(path+'\db.db')cur = conn.cursor()。

这样就连接上了刚才的数据库。 path+'\db.db' 是数据库的路径及文件名,你可以手动输入路径,也可以将 .py 文件和 db.db 数据库文件放在同一目录下,系统自动计算路径,这是懒人方法。

2.2 查询数据库中有哪些表

我们似乎不知道 db.db 这个数据库中有什么,如何才能知道这个数据库中有哪些表呢?

cur.execute("SELECT name FROM sqlite_master WHERE type='table';")Tables=cur.fetchall()print(Tables)# [('numbers',)]

2.3 删除数据库中的某个表

如果需要删除数据库中的某个表,可以执行以下命令:

cur.execute("drop table tablename;")。

2.4 查询某个表的结构

cur.execute("PRAGMA table_info(numbers)")print(cur.fetchall())# [(0, 'id', 'integer', 0, None, 1), (1, 'number', 'varchar(20)', 1, None, 0)]

2.5 查询表中前50条记录

cur.execute("SELECT * from numbers limit 0,50;")conn.commit data = cur.fetchall()print(data)。

2.6 查询表中所有记录

# 5.查询表中所有记录cur.execute("SELECT * from numbers;") data_all = cur.fetchall()a = len(data_all)print('共有 '+ str(a) + ' 条记录')#print(data)。

2.7 查询表中不重复记录

cur.execute("SELECT distinct number from numbers;") data_distinct = cur.fetchall()b = len(data_distinct)print('共有 '+ str(b) +' 条不重复记录')#print(data_distinct)。

2.8 将老表中的不重复记录插入新表

# 创建一个新表cur.execute('create table if not exists numbers_distinct (id integer primary key ,number varchar(20) NOT NULL)')conn.commit()# 插入数据i = 0for data in data_distinct: i += 1 data = data[0] #print(data) cur.execute('insert into numbers_distinct values(?,?)',(i,data)) conn.commit()。

2.9 将特定结果写入文本文件(单列)

cur.execute("SELECT number from numbers_distinct limit 0,10;") datas = cur.fetchall()#print(datas)with open('datafile1.txt','w') as f1: for data in datas: f1.write(data[0]) f1.flush()。

注意: f1.flush() 操作很重要!将缓冲区的数据写入文件中,否则文本文件为空白,导致写入失败。

2.10 将特定结果写入文本文件(多列)

cur.execute("SELECT * from numbers_distinct limit 0,10;") datas = cur.fetchall()#print(datas)with open('datafile2.txt','w') as f2: for data in datas: data0 = str(data[0]) # 将int类型转为str,否则write函数报错 data = data0 + ' ' + data[1] # 在两列之间以Tab键分隔 f2.write(data) f2.flush()。

2.11 将特定结果写入CSV文件(多列)

写入CSV文件和写入文本文件的方法基本相同,只需要将文件后缀改为 '.csv',并将分隔符改为英文状态下逗号即可。

with open('datafile3.csv','w') as f3: for data in datas: data0 = str(data[0]) # 将int类型转为str,否则write函数报错 data = data0 + ',' + data[1] # 在两列之间以逗号键分隔 f3.write(data) # data是元组类型 f3.flush() # 重要!将缓冲区的数据写入文件中。

2.12 办公自动化案例

1)源代码

2)运行效果

导出719个TXT文件,几秒钟就完成了。

3)重点代码解释

这个案例的重点是如何计算出每个TXT文件的名称。

我们可以计算出 numbers_distinct 表中共有35926条数据。

我们可以构建这样一个函数: filename = str(50*n) + '-' + str(50*n+50) + '.txt' ,用来计算每个导出的TXT文件名称。

但是最后一个文件的名称不能通过这个方法来构建,需要作以下简单的修改: filename = str(50*n) + '-' + str(b) + '.txt'

计算好每个TXT文件名称后,直接用 write 函数写入就可以了。

快来动动手试一下吧,享受一下办公自动化!

扫描下方二维码, 回复【课程】获取精选视频课程!