一、文件存储

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 模块 效率对比
我们通过写入一百万条数据,发现csvpandas的效率要快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模块比pandas35%左右

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()

结果
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐