Python 数据存储,实现数据写入TXT、Json、Excel、数据库(Mysql、MongoDB、SQL Server)
一、文件存储1.1 TXT 文件存储方式1fp = open(filename,mode,encoding) 方法用于打开一个文件,并返回文件对象fp.函数方法()调用函数方法fp.close() 关闭文件fp = open('model_two.txt',mode='a',encoding='utf-8')fp.read()fp.write('123')fp.readline()# fp.see
一、文件存储
1.1 TXT 文件存储
方式1
fp = open(filename,mode,encoding)
方法用于打开一个文件,并返回文件对象
fp.函数方法()
调用函数方法
fp.close()
关闭文件
fp = open('model_two.txt',mode='a',encoding='utf-8')
fp.read()
fp.write('123')
fp.readline()
# fp.seek(偏移量,[起始位置])
# 偏移量: 单位为字节,可正可负
# 起始位置: 0 - 文件头, 默认值; 1 - 当前位置; 2 - 文件尾
fp.see(2,0)
fp.close()
# 结果
ABCDE
FGHIJ
KLMNO
-----
CDE
FGHIJ
KLMNO
方式二
采用 with open
的方式不需要关闭文件,程序会自动关闭文件
with open(filename,mode='r',encoding='utf-8) as fp:
fp.read()
两种方式效率对比
import time
def model_one():
for i in range(10000):
with open('model_one.txt',mode='a',encoding='utf-8') as fp:
fp.write(str(i)+'\n')
def model_two():
fp = open('model_two.txt',mode='a',encoding='utf-8')
for i in range(10000):
fp.write(str(i)+'\n')
fp.close()
if __name__ == '__main__':
#--- 方式一耗时大约:10.5秒 ---#
start = time.time()
model_one()
print('model_one useing time {}: '.format(time.time()-start))
#--- 方式二耗时大约: 0.6秒 ---#
start = time.time()
model_two()
print('model_two useing time {}: '.format(time.time() - start))
使用with open
方法每次循环操作都会打开文件,这样程序的效率便会下降
1.2 JSON 文件存储
- json 方法
- dumps: 把数据类型装换为字符串
- dump: 把数据类型装换为字符串并存储在文件中
- loads: 把字符串类型转为数据类型
- load: 打开文件,把字符串转化为数据类型
json数据之间转换
import json
dic = {'k1':'v1','k2':'v2','k3':'v3','k4':'v4'}
li = [1,'2','jack',[100,'200',True],True,(12,34),{'key':'value'}]
tup = (1,2,3,(4,5),[44,55])
# 元组类型会转变为list类型
data1 = json.dumps(tup)
print(data1,type(data1)) # [1, 2, 3, [4, 5], [44, 55]] <class 'str'>
data2 = json.loads(data1)
print(data2,type(data2)) # [1, 2, 3, [4, 5], [44, 55]] <class 'list'>
写入json文件操作
data = [{str(i):str(i*i)} for i in range(10000)]
with open('data.json','w',encoding='utf-8') as fp:
json.dump(data,fp)
print('ok')
1.3 CSV 文件存储
csv 模块写入文件
import csv
def save_csv_one(filename,data):
"""
:param filename: 文件名
:param data: 要存储的数据 列表套列表,列表套元组,字典存储的是key。
"""
fp = open(filename,'w',newline='')
writer = csv.writer(fp)
writer.writerows(data) # 数据格式 [[],[]] 或者 [(),()]
pandas 模块写入csv 文件
def save_csv_two(filename,data):
"""
:param filename: 文件名
:param data: 要存储的数据 存在默认索引,如果是列表套字典,则字典的key就是csv的第一栏,如果是列表套列表则需要指定colmun,否则默认以0开始为索引
:return:
"""
data = pd.DataFrame(data) # 列表套列表可以指定 columns=['姓名','年龄','地点'] 默认以0开始为索引
data.to_csv(filename,encoding='utf_8_sig',index=False)
csv模块 & pandas 模块 效率对比
我们通过写入一百万条数据,发现csv
比pandas
的效率要快33%
左右
import csv
import pandas as pd
import time
def save_csv_one(filename,data):
fp = open(filename,'w',newline='')
writer = csv.writer(fp)
writer.writerows(data) # 数据格式 [[],[]] 或者 [(),()]
def save_csv_two(filename,data):
data = pd.DataFrame(data) # columns=['姓名','年龄','地点']
data.to_csv(filename,encoding='utf_8_sig',index=False)
if __name__ == '__main__':
#--- 方式一 ---#
start = time.time()
data1 = [[str(i),str(i*i)] for i in range(1000000)]
save_csv_one('save_csv_one.csv',data1)
print(f'csv model useing time: {time.time()-start}')
#--- 方式二 ---#
start = time.time()
data2 = [{'key':str(i),'value':str(i*i)} for i in range(1000000)]
save_csv_two('save_csv_two.csv',data2)
print(f'pandas model useing time: {time.time() - start}')
# ================= 结果 =================== #
csv model useing time: 2.0604968070983887
pandas model useing time: 3.1460108757019043
1.4 Excel 表格写入数据
使用xlwt模块写入数据
import xlwt
def set_style():
style = xlwt.XFStyle()
font = xlwt.Font()
font.name = 'consolas' # 指定字体样式
font.bold = True # 加粗
font.colour_index = 4 # 指定字体颜色,0:黑色;1:白色,2:红色。。。
font.height = 220 # 设置字体大小,220表示字体大小为12 。600则表示字体大小为30
style.font = font # 应用字体样式
return style
def save_excel_xlwt(filename,data):
workbook = xlwt.Workbook(encoding='utf-8') # 针对列表套列表
sheet = workbook.add_sheet('sheet01')
sheet.write(0,0,'jim',set_style())
sheet.write(1,0,'tom',set_style())
sheet.write(2,0,'rion',set_style())
sheet.write(3,0,'jack',set_style())
workbook.save(filename)
运行结果
pandas 模块写入Excel
def save_excel_pd(filename,data):
writer = pd.ExcelWriter(filename) # 实例化写入文件对象
df = pd.DataFrame(data) # 数据类型转换,若数据为列表套列表,则在此指定columns参数
df.to_excel(writer,index=False,encoding='utf-8',sheet_name='sheet')
writer.save()
xlwt模块 & pandas模块 写入速度比较
往Excel文件中写入五万条数据,测试发现 xlwt
模块比pandas
快35%
左右
def save_excel_xlwt(filename,data):
workbook = xlwt.Workbook(encoding='utf-8') # 针对列表套列表
sheet = workbook.add_sheet('sheet01')
for i in range(len(data)):
for j in range(len(data[i])):
sheet.write(i,j,data[i][j])
workbook.save(filename)
def save_excel_pd(filename,data):
writer = pd.ExcelWriter(filename)
df = pd.DataFrame(data,columns=['col1','col2','col3','col4'])
df.to_excel(writer,index=False,encoding='utf-8',sheet_name='sheet')
writer.save()
if __name__ == '__main__':
data = [(i, i * 2, i * 3, i * 4) for i in range(50000)]
#--- xlwt 模块写入数据 ---#
start = time.time()
save_excel_xlwt('data/save_excel_xlwt.xlsx',data)
print('xlwt using time:{} '.format(time.time()-start))
# --- pandas 模块写入数据 ---#
start = time.time()
save_excel_pd('data/save_excel_pd.xlsx',data)
print('pd using time:{} '.format(time.time() - start))
# ================= 结果 ================= #
xlwt using time:1.1875851154327393
pd using time:1.8992464542388916
二、数据库操作
2.1 MySQL数据存储
MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
操作流程
import pymysql
def ConMysql():
# 1.建立连接对象
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root', # mysql账号
passwd='123456', # mysql密码
charset='utf8', # utf8mb4 编码用于处理一些特殊的字符转码格式,比如那种图表情之类
database='crawl_db' # 指定数据库
)
# 2.建立游标(类似于终端下的那一根横杠) # 不指定cursor,则以元组的形式返回
cursors = conn.cursor(cursor=pymysql.cursors.DictCursor) # pymysql.cursors.DictCursor 以字典的形式返回数据
# 3.建立sql语句
sql = 'select * from stu_test' # 书写sql语句
# 4.获取sql语句返回的数据
ret = cursors.execute(sql)
# cursor.executemany(sql,data_list) # 批量插入数据,注意列表中的字段数与MySQL字段数要一一对应
# 5.把数据进行提取操作
print(cursors.fetchone()) # 抓取一条数据
# print(cursors.fetchall()) # 抓取全部数据
# 6.游标位置移动指定数值
cursors.scroll(0) # 以当前游标移动的位置开始移动的行数,0表示移动一行
print(cursors.fetchall())
if __name__ == '__main__':
ConMysql()
实例:创建数据表,并插入数据
import pymysql
def save_mysql():
# 1.数据库连接
conn = pymysql.connect(host='127.0.0.1', user='root', password="123456",
database='study_db', port=3306, charset='utf8') # autocommit
# 2.建立游标
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
#3.数据表是否存在,存在则删除
table_is_have = 'DROP TABLE IF EXISTS stu_test'
cursor.execute(table_is_have) # 执行操作
# 4.创建数据表
create_table_sql = """create table stu_test(
id int not null auto_increment primary key,
name varchar(128) not null,
age int not null,
address varchar(255)
)"""
# 5.创建数据表
cursor.execute(create_table_sql)
# 插入一条数据
insert_one_data = 'insert into stu_test(name,age,address) value("Rion","18","shenzheng")'
cursor.execute(insert_one_data)
# 6.插入多条数据
data = [[f'Jack{i}',i,f'beijing{i}']for i in range(1,10)] # 数据格式:[[Jack1,1,beijing1],[Jack2...]]
insert_many_data = 'insert into stu_test(name,age,address) value(%s,%s,%s)'
cursor.executemany(insert_many_data,data)
# 7. 关闭数据库连接
conn.commit() # 提交,若在连接对象时,添加auto_commit=True 参数,则不需要书写这行。
conn.close()
if __name__ == '__main__':
save_mysql()
2.2 MongoDB 数据存储
MongoDB 是一个基于分布式文件存储的开源数据库系统,数据结构有键值对组成。
import pymongo
def save_mongo():
client = pymongo.MongoClient("mongodb://127.0.0.1:27017")
db = client['study']
col = db['stu_test']
#--- 插入数据 ---#
data = {'name':'rion','age':'18','gender':'male'}
data_list = [{'key':i,'value':i*i }for i in range(10)]
col.insert_one(data) # 插入一条数据
ret = col.insert_many(data_list) # 插入多条数据
print(ret) # 返回一个对象
#--- 查询数据 ---#
ret = col.find_one() # 查询一条数据
print(ret)
[print(c) for c in col.find()] # 批量查询
#--- 修改数据 ---#
select_data = {'name':'rion'}
change_data = {'$set':{"age":"21"}} # 修改一条数据
col.update_many(select_data,change_data) # 修改多条数据
#--- 删除数据 ---#
[print(c) for c in col.find()]
del_data = {'name':'jack'}
col.delete_one(del_data) # 删除一条数据
col.delete_many(del_data) # 删除多条数据
if __name__ == '__main__':
save_mongo()
2.3 SQLServer 数据存储
2.3.1 SQLServer基础设置
SQLserver是微软旗下的一个关系型数据库,只能服务于Windows系统。
开启TCP/IP
启用两种验证方式
修改sa用户的密码
连接成功
2.3.2 代码操作
import pymssql
def save_mssql():
# 1.连接数据库
conn = pymssql.connect('127.0.0.1','sa','666666','test')
# 2.建立游标
cursor = conn.cursor()
# 3. 创建数据库
cursor.execute("""
IF OBJECT_ID('weibo1', 'U') IS NOT NULL
DROP TABLE weibo1
CREATE TABLE weibo1 (
id INT NOT NULL identity(1,1),
text VARCHAR(1000),
username VARCHAR(64),
usersite VARCHAR(164),
commenttext VARCHAR(1000),
PRIMARY KEY(id)
)
""")
# 字典构建的数据集 -- 写入数据
data_dic = [{'text': '谢谢阿郎老师@Dear黃俊郎 ,谢谢迈可老师@林迈可 ,希望大家也能够简简单单的听这首歌#微博首播# 树读', 'user_name': '景甜', 'user_site': 'https://m.weibo.cn/u/1270344441', 'comment_text': '逢考必过'}, {'text': '谢谢阿郎老师@Dear黃俊郎 ,谢谢迈可老师@林迈可 ,希望大家也能够简简单单的听这首歌#微博首播# 树读', 'user_name': '淘宝优惠券合集', 'user_site': 'https://m.weibo.cn/u/6172294248', 'comment_text': '我觉得我就算用了全部的爱给你,还觉得不够,谁能借我更多的爱,我要把爱聚集起来,给你能量,让你更加闪耀,照亮我们粉丝,你再我心里简直完美谁能借我更多的爱'}]
for d in data_dic:
sql = "insert into weibo1(text,username,usersite,commenttext) VALUES ('%s', '%s', '%s', '%s');" % (
d['text'],
d['user_name'],
d['user_site'],
d['comment_text'])
cursor.execute(sql)
# 元组构建的数据集 -- 批量写入数据
data_tup = [('h1','h2','h3','h4'),('q1','q2','q3','q4'),('w1','w2','w3','w4'),('e1','e2','e3','e4')]
cursor.executemany(
"INSERT INTO weibo1(text,username,usersite,commenttext) VALUES (%s,%s,%s,%s)",data_tup
)
# 如果没有指定autocommit属性为True的话就需要调用commit()方法
conn.commit()
if __name__ == '__main__':
save_mssql()
结果
更多推荐
所有评论(0)