python读取文件数据写入到数据库中,并反向从数据库读取保存到本地

学python,操作数据库是必不可少的,不光要会写python代码,还要会写SQL语句,本篇文章主要讲如何把本地txt文件中的数据读取出来并写入到对应的数据库中,同时将数据库单个表中的数据读出来保存在本地txt文件中。
话不多说,我们开始吧!

读取文件数据写入到数据库

读取文件数据并封装
有两个txt文件,一个是普通文本格式,一个是json格式,部分数据截图见本篇文章的最后附录部分。一个是2011年的1月份销售数据,一个是2011年的2月份销售数据,我们需要分别读出这两个文件的数据并写入同一个表中。
1月份数据是普通文本,使用逗号分割数据记录,从前到后分别是(日期,订单id,销售额,销售省份);
2月份数据是JSON数据,同样包含 (日期,订单id,销售额,销售省份)
根据面向对象的思想,我们可以设计一个FileReader类,进行数据的读取,我们读取到的数据也可以封装到一个类里面,叫做数据封装类,也就是每一条数据都可以得到一个具体的类对象;
(1)数据定义的类
设计一个类,完成数据封装,新建一个python文件,名为:data_define.py,根据数据的分析,成员变量包含 date, order_id, money, province
# 数据定义的类
class Record:def __init__(self, date, order_id, money, province):self.date = date # 订单日期self.order_id = order_id # 订单IDself.money = money # 订单金额self.province = province # 销售省份def __str__(self):return f"{self.date}, {self.order_id}, {self.money}, {self.province}"
(2)定义文件相关的类
设计一个抽象类,定义文件读取的相关功能,并使用子类实现具体功能,因为文件的数据格式不同,我们读取文件的具体实现逻辑也不一样,所以定义一个抽象类,通过子类去实现具体数据的具体读取方法。
新建一个python文件,名为:file_define.py,先定义一个抽象类FileRecord用来做顶层设计,确定有哪些功能(read_data方法)需要实现,并分别定义TextFileRecord类和JsonFileRecord类,继承FileRecord类,复写父类的read_data方法,
具体代码如下:
from data_define import Record
import json# 先定义一个抽象类用来做顶层设计,确定有哪些功能需要实现
class FileRecord:def read_data(self) -> list[Record]:# 读取文件的数据,读到的每一条数据都转换为Record对象,将他们都封装到List内并返回即可passclass TextFileRecord(FileRecord):def __init__(self, path):self.path = path # 定义成员变量记录文件路径# 复写(实现抽象方法)父类的方法def read_data(self) -> list[Record]:f = open(self.path, "r", encoding="UTF-8")record_list: list[Record] = []for line in f.readlines():line = line.strip() # 消除读取到的每一行数据中的\ndata_list = line.split(",")record = Record(data_list[0], data_list[1], int(data_list[2]), data_list[3])record_list.append(record)# print(record_list)f.close()return record_listclass JsonFileRecord(FileRecord):def __init__(self, path):self.path = path # 定义成员变量记录文件路径# 复写(实现抽象方法)父类的方法def read_data(self) -> list[Record]:f = open(self.path, "r", encoding="UTF-8")record_list: list[Record] = []for line in f.readlines():data_dict = json.loads(line)record = Record(data_dict["date"], data_dict["order_id"], data_dict["money"], data_dict["province"])record_list.append(record)# print(record_list)f.close()return record_listif __name__ == '__main__':# 测试读取文本文件text_file_record = TextFileRecord("G:\资料\2011年1月销售数据.txt")lin1 = text_file_record.read_data()for l1 in lin1:print(l1)# 测试读取json文件json_file_record = JsonFileRecord("G:\资料\2011年2月销售数据JSON.txt")lin2 = json_file_record.read_data()for l2 in lin2:print(l2)
运行结果:

(3)合并数据
新建一个python文件main.py,读取数据并将1月份数据和2月份数据合并
from file_define import FileRecord, TextFileRecord, JsonFileRecord
from data_define import Recordtext_file_record = TextFileRecord("G:\资料\2011年1月销售数据.txt")
json_file_record = JsonFileRecord("G:\资料\2011年2月销售数据JSON.txt")
jan_data: list[Record] = text_file_record.read_data() # 读取1月份数据并保存到jan_data
feb_data: list[Record] = json_file_record.read_data() # 读取2月份数据并保存到feb_data
all_data: list[Record] = jan_data + feb_data # 合并两个月份的数据
# print(all_data)
合并数据之后的结果:

构建数据库链接并写入数据库
我们首先需要导包:from pymysql import Connection,我在代码中分别创建了sell数据库和orders表,其实可以直接通过数据库可视化工具创建,创建完成后直接执行insert插入语句即可,参考代码如下:
# 构建数据库链接
conn = Connection(host="localhost",port=3306,user="root",password="123456",autocommit=True # 执行sql语句时自动提交
)
# 构建游标对象
cur = conn.cursor()
cur.execute("SHOW DATABASES")
database_list = []
for db in cur:database_list.append(db[0])
print(database_list) # 打印出当前所有数据库
if "sell" in database_list: # 如果数据库存在则不创建,如果不存在则创建数据库sellpass
else:creat_data_base = "CREATE DATABASE sell"cur.execute(creat_data_base)conn.select_db("sell")
cur.execute("SHOW TABLES")
tab_list = []
for tab in cur:tab_list.append(tab[0])
print(tab_list) # 打印当前库中的所有表
if "orders" in tab_list: # 如果表存在则不创建,如果不存在则创建表orderspass
else:cur.execute("CREATE TABLE orders(order_date DATE,order_id VARCHAR(255),money INT,province VARCHAR(10))")
# 遍历所有数据,并执行插入语句
for record in all_data:sql = f"INSERT INTO sell.orders(order_date,order_id,money,province) VALUES ('{record.date}','{record.order_id}',{record.money},'{record.province}')"print(sql)cur.execute(sql)# 关闭数据库链接
cur.close()
运行代码成功之后,可在数据库中看到,数据已经正常写入orders表中:

从数据库读取数据并保存到本地
相对写入数据来说,读取数据保存到本地更加简单,先从数据库读取数据,然后处理数据,之后保存到本地文件即可。
(1)保存为txt文件
代码如下:
from pymysql import Connection
from data_define import Record# 构建数据库链接
conn = Connection(host="localhost",port=3306,user="root",password="123456",autocommit=True # 执行sql语句时自动提交
)
# 构建游标对象
cur = conn.cursor()
cur.execute("select * from sell.orders") # 读取orders表中的所有数据record_list = []
for data in cur:record = Record(data[0], data[1], data[2], data[3])record_list.append(record) # 将读取的每一数据封装成一个Record对象并添加到record_list列表中f = open("E:\sell_orders_data.txt", 'w') # 文件存在,则直接覆盖文件中的内容写入,不存在,先创建文件再写入数据
for sell_data in record_list:# 只能写入str类型的,则把读取的Record对象转化为str,每个字段用","分割str_data = str(sell_data.date) + "," + sell_data.order_id + "," + str(sell_data.money) + "," + sell_data.provincef.write(str_data)f.write("\n")
f.close()
查看保存的txt文件:

(2)保存为excel文件
代码如下:
import xlwt
# 写入到excel文件中
# 调用xlwt模块中的Workbook方法来创建一个excel表格类型文件,style_compression设置是否压缩,赋值为0表示不压缩。
book = xlwt.Workbook(encoding='utf-8', style_compression=0)
# 用book对象调用add_sheet方法来建立一张sheet表,这里面的第一个参数很明显就是设置sheet表格的名称,第二个参数cell_overwrite_ok用于确认同一个cell单元是否可以重设值,这里赋值为True就表示可重设值。
sheet = book.add_sheet('销售数据表', cell_overwrite_ok=True)
# 用一个元组col自定义列的数量以及各列的属性名
col = ('销售日期', '订单ID', '销售额', '省份')
# 写入表头
for i in range(0, 4):sheet.col(i).width = 5000 # 设置宽度sheet.write(0, i, col[i])
datastyle = xlwt.XFStyle() # 创建一个样式对象,初始化样式
datastyle.num_format_str = 'yyyy-mm-dd' # 设置日期格式
# 循环record_list数据并写入
for row in range(1, len(record_list) + 1):sheet.write(row, 0, record_list[row - 1].date, datastyle) # 如果不加datastyle,写出来的日期列格式是不对的sheet.write(row, 1, record_list[row - 1].order_id)sheet.write(row, 2, record_list[row - 1].money)sheet.write(row, 3, record_list[row - 1].province)book.save('E:\订单销售额.xls')f.close()
查看保存的excel文件:

附录


行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: 320231853,里面有各种软件测试+开发资料和技术可以一起交流学习哦。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

相关文章:
python读取文件数据写入到数据库中,并反向从数据库读取保存到本地
学python,操作数据库是必不可少的,不光要会写python代码,还要会写SQL语句,本篇文章主要讲如何把本地txt文件中的数据读取出来并写入到对应的数据库中,同时将数据库单个表中的数据读出来保存在本地txt文件中。 话不多说…...
社交媒体数据恢复:Viber
Viber是一款流行的即时通讯应用,用于发送消息、语音通话和视频通话。然而,有时候我们会不小心删除一些重要的Viber聊天记录,这时候就需要进行数据恢复。本文将介绍如何在安卓设备上进行Viber数据恢复。 一、使用安卓数据恢复软件 安卓数据恢…...
蓝桥杯赛事介绍
蓝桥杯是由工业和信息化部人才交流中心主办的全国性IT学科赛事,全称为“蓝桥杯全国软件和信息技术专业人才大赛”。该赛事旨在推动软件和信息领域专业技术人才培养,提升大学生的创新能力和就业竞争力,为行业输送具有创新能力和实践能力的高端…...
TypeScript系列之-深度理解基本类型画图讲解
JS的类型(8): null undefined string number boolean bigint symbol object(含 Array, Function,Date.....) TS的类型(87): 以上所有,加上 void, never, enum, unknown, any 再加上自定义类型 type interface 上一节我们说…...
Debian
使用root用户操作 直接使用su命令进行切换。 配置用户使用sudo命令 在安装好系统之后,使用用户名登录之后。需要执行需要root权限的命令,会发现无法执行成功。原因是没有配置用户使用sudo的权限。 编辑bash /etc/sudoers文件 可以先切换root用户安装…...
怎么使用JMeter进行性能测试?
一、简介 JMeter是Apache软件基金会下的一款开源的性能测试工具,完全由Java开发。它专注于对我们应用程序进行负载测试和性能测量,最初设计用于web应用程序,现在已经扩展到其他测试功能,比如:FTP、Database和LDAP等。…...
MySQL:锁的分类
文章目录 行级锁Record LockGap LockNext-Key Lock插入意向锁 表级锁表锁元数据锁(MDL)意向锁AUTO-INC 锁 全局锁 行级锁 Record Lock 记录锁有S锁(共享锁/读锁)和X锁(排他锁/写锁)之分,加完S…...
基于springboot实现房屋租赁管理系统设计项目【项目源码+论文说明】
基于springboot实现房屋租赁管理系统设计演示 摘要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对房屋租赁信息管理混乱&…...
揭秘Redis底层:一窥数据结构的奥秘与魅力
一、引言 Redis,以其高性能、高可靠、丰富的数据结构等特点,成为现代应用程序中不可或缺的缓存与存储组件。然而,Redis之所以能够实现如此卓越的性能,离不开其底层精巧的数据结构设计。本文将深入浅出地解析Redis底层五大核心数据…...
【网站项目】智能停车场管理系统小程序
🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板ÿ…...
芒果YOLOv5改进94:检测头篇DynamicHead为目标检测统一检测头:即插即用|DynamicHead检测头,尺度感知、空间感知、任务感知
该专栏完整目录链接: 芒果YOLOv5深度改进教程 该创新点:在原始的Dynamic Head的基础上,对核心部位进行了二次的改进,在 原论文 《尺度感知、空间感知、任务感知》 的基础上,在 通道感知 的层级上进行了增强,关注每个像素点的比重。 在自己的数据集上改进,有效涨点就可以…...
获奖名单出炉,OurBMC开源大赛总决赛圆满落幕
4 月 12 日,由开放原子开源基金会牵头、OurBMC 社区及理事长单位飞腾信息技术有限公司联合承办的 OurBMC 开源大赛总决赛在江苏宿迁圆满落幕。共有 10 支参赛队伍凭着初赛的优异表现进入决赛,在路演现场上演了一场精彩绝伦的对决。 江苏省工信厅软件和信…...
Qt配置外部库(Windows平台)
这里以C的外部库nlopt为例子来示范,右键工程选择添加库,然后选择库文件的目录(dll.a),会自动设置好包含路径(一般是include的目录),添加库(最下面一行) &…...
(最新)华为 2024 届实习招聘-硬件通⽤/单板开发——第十一套和十二套
(最新)华为 2024 届实习招聘-硬件通⽤/单板开发——第十一套和十二套 部分题目分享,完整版带答案(有答案和解析,答案非官方,未仔细校正,仅供参考)(共十套)获取ÿ…...
js纯前端实现语音播报,朗读功能(2024-04-15)
实现语音播报要有两个原生API 分别是【window.speechSynthesis】【SpeechSynthesisUtterance】 项目代码 // 执行函数 initVoice({text: 项目介绍,vol: 1,rate: 1 })// 函数 export function initVoice(config) {window.speechSynthesis.cancel();//播报前建议调用取消的函数…...
PostgreSQL数据库基础--简易版
数据库 其中runoobdb为数据库名 查看已经存在的数据库 \l进入数据库 \c runoobdb创建数据库 CREATE DATABASE runoobdb;删除数据库 DROP DATABASE runoobdb;表 其中COMPANY为表名 创建表格 CREATE TABLE COMPANY(ID INT PRIMARY KEY NOT NULL,NAME TEXT…...
前端解析URL的两种方式
方法一:利用 splice 分割 循环依次取出 方法一: function queryURLparams(url) {let obj {}if (url.indexOf(?) < 0) return objlet arr url.split(?)url arr[1]let array url.split(&)for (let i 0; i < array.length; i) {let arr2…...
Linux的学习之路:6、Linux编译器-gcc/g++使用
摘要 本文主要是说一些gcc的使用,g和gcc使用一样就没有特殊讲述。 目录 摘要 一、背景知识 二、gcc如何完成 1、预处理(进行宏替换) 2、编译(生成汇编) 3、汇编(生成机器可识别代码 4、链接(生成可执行文件或…...
分享2024 golang学习路线
写在前面 Go语言(也称为Golang)是Google开发的一种静态强类型、编译型语言,它具有简洁、快速、安全、并发等特点,尤其适合构建大型软件、微服务架构和云平台服务。Go的学习曲线相对平缓,社区活跃,是现代编…...
【Linux】进程间通信——system V版本 共享内存
目录 共享内存 原理 实践 shmget() 创建共享内存 shmctl() 删除共享内存 shmat() 挂接进程和共享内存 shmt() 进程和共享内存去关联 共享内存的特性 优势 劣势 用共享内存实现进程间通信 共享内存 原理 两个进程的PCB各自维护着一个进程地址空间。当两个进…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...
02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...
