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各自维护着一个进程地址空间。当两个进…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...
