7.json模块
- 什么是json:
json模块是一个序列化模块,是一种"第三方"的特殊数据格式
- 为什么要使用json
为了让不同的语言之间数据可以共享。
PS: 由于各种语言的数据类型不一,但长相可以一样, 比如python不能直接使用其他语言的数据类型,必须将其他语言的数据类型转换成json数据格式,python获取到json数据后可以将json转换成pyton的数据类型。
- 如何使用json
在python中:
可以将python数据类型----》json数据格式----》字符串----》存到文件中
若其他语言想要使用python的技能:
将文件中的数据---》字符串---》json数据格式---》其他语言的数据类型
注意: 在json中,所有的字符串都是双引号 元组比较特殊: python中的元组,若将其转换成json数据,内部会将元组转换成 列表 set是不能转换成json数据
如何使用: 关于dumps,loads功能 import json - json.dumps: json.dumps(), f = open() --> f.write() # 序列化: python数据类型 ---》 json ---》 字符串 ---》 json文件中 - json.loads: f = open(), str = f.read(), json.loads(str) # 反序列化: json文件中 --》 字符串 ---》 json ---》 python或其他语言数据类型 import json list1 = ['sean','坦克','123'] tuple1 = ('sean','坦克','123') set1 = {'sean','坦克','123'} # 注意集合不能被json序列化 dict1 = {'name':'sean','name2':'坦克','编号':'123'} # 将python数据 ---》 json数据格式 ---》 字符串 # ensure_ascii将默认的ascii取消设置为False,可以在控制台看到中文,否则看到的是bytes类型数据 json_str = json.dumps(list1,ensure_ascii=False) json_str1 = json.dumps(tuple1,ensure_ascii=False) # json_str2 = json.dumps(set1,ensure_ascii=False) 注意:集合不能被序列化成json类型 json_str3 = json.dumps(dict1,ensure_ascii=False) print(json_str) print(type(json_str)) # 输出结果:["sean", "坦克", "123"] <class 'str'> print(json_str1) # 输出结果["sean", "坦克", "123"] ,元组返回的也是列表 # print(json_str2) 注意:集合不能被序列化成json类型 print(json_str3) # 输出结果:{"name": "sean", "name2": "坦克", "编号": "123"} # 字典依然是字典,但是是字符串类型 print(type(json_str)) <class 'str'> # 在json中,所有的字符串都是双引号 # json_str = json.dumps(list1,ensure_ascii=True) # print(json_str) # # 中文显示的是bytes类型 # 输出结果;["sean", "\u5766\u514b", "123"] <class 'str'> # json.loads()字符串 ----> json数据格式 ---》将python数据 python_date = json.loads(json_str) print(python_date) print(type(python_date)) # 输出结果:['sean', '坦克', '123'] <class 'list'> # 简单注册功能 def register(): user_name = input('请输入用户名:').strip() pass_word = input('请输入密码:').strip() re_pwd = input('请输入密码:').strip() if pass_word == re_pwd: user_dic = {'用户名':user_name,'密码':re_pwd} json_str = json.dumps(user_dic,ensure_ascii=False) # 转换成json序列,并且可以中文显示 with open('user_count','w',encoding='utf-8')as f: f.write(json_str) print('注册成功') register()
关于dump,load功能 - json.dump(): # 序列化: python数据类型 ---》 json ---》 字符串 ---》 json文件中 #- 内部实现 f.write() import json user_dic = {'name':'tank','age':'73'} f = open('tank','w',encoding='utf-8') json_user = json.dumps(user_dic,ensure_ascii=False) f.write(json_user) # 写入文件必须以字符串的格式,字典及其他类型都不可以 f.close() import json user_dic1 = {'name':'tank','age':'73'} wf = open('tank2','w',encoding='utf-8') json.dump(user_dic1,wf,ensure_ascii=False) # dump可以直接将内容写入文件,将两步变为一步 f.close() - json.load(): # 反序列化: json文件中 --》 字符串 ---》 json ---》 python或其他语言数据类型 #- 内部实现 f.read() # import json with open('tank','r',encoding='utf-8') as rf: print(rf.read()) print(type(rf.read())) # 打印出来的是个字符串 res = json.load(rf) print(res) print(type(res)) # 打印出来是原类型,元组会转换成列表 - dump, load: 使用更方便 注意: 保存json数据时,用.json作为文件的后缀名
8.pickle模块
''' pickle模块: pickle是一个python自带的序列化模块。功能上也是dump,laod,dmps,loads 优点: - 可以支持python中所有的数据类型 - 可以直接存 "bytes类型" 的数据,pickle存取速度更快 缺点: (致命的缺点) - 只能支持python去使用,不能跨平台 ''' import pickle # set1 = { # 'tank', 'sean', 'jason', '大脸' # } # # # 写 dump # with open('tank ', 'wb') as f: # pickle.dump(set1, f) # 读 load with open('tank', 'rb') as f: python_set = pickle.load(f) print(python_set) print(type(python_set))
9.collections模块
collections模块: 提供一些python八大数据类型 “以外的数据类型” 。
以具名元组,有序字典为例
import collections ''' - python默认八大数据: - 整型 - 浮点型 - 字符串 - 字典 - 元组 - 列表 - 集合 - 布尔 ''' ''' 主要应用: - 具名元组: from collections import namedtuple 具名元组 只是一个名字。 应用场景: - 坐标 - 有序字典: from collections import OrderedDict - python中字典默认是无序 - collections中提供了有序的字典 ''' # 第一种具名元组 # # 坐标 from collections import namedtuple # 导入namedtuple # point = namedtuple('坐标',['x','y','z']) point1 = namedtuple('坐标',('x','y','z')) point2 = namedtuple('坐标','x,y,z') point3 = namedtuple('坐标',{'x','y','z'}) point4 = namedtuple('坐标',{'x':8,'y':9,'z':10}) # 字典更换了key p = point(1,2,3) # 传参的个数要与nametuple的第二个参数个数一一对应 p1 = point1(1,2,3) # 传参的个数要与nametuple的第二个参数个数一一对应 p2 = point2(1,2,3) # 传参的个数要与nametuple的第二个参数个数一一对应 p3 = point3(1,2,3) # 传参的个数要与nametuple的第二个参数个数一一对应 p4 = point3(1,2,3) # 传参的个数要与nametuple的第二个参数个数一一对应 print(p) print(p1) print(p2) print(p3) print(p4) print(type(p)) print(type(p1)) print(type(p2)) print(type(p3)) print(type(p4)) # # ''' # 输出结果: # 坐标(x=1, y=2, z=3) # 坐标(x=1, y=2, z=3) # 坐标(x=1, y=2, z=3) # 坐标(x=1, z=2, y=3) # 坐标(x=1, z=2, y=3) # 字典将key更换了 # <class '__main__.坐标'> # <class '__main__.坐标'> # <class '__main__.坐标'> # <class '__main__.坐标'> # <class '__main__.坐标'> # 扑克牌 card = namedtuple('扑克牌',['color','number']) red = card('♥','A') print(red) black = card('♠','A') print(black) # 第二种 有序字典 # python中的字典默认为无序字典 dic = dict({'x': 1, 'y': 2, 'z': 3}) print(dic) print(type(dic)) for line in dic: print(line) from collections import OrderedDict # 导入OrderedDict order_dict = OrderedDict({'x': 1, 'y': 2, 'z': 3}) print(order_dict, '打印有序的字典') print(type(order_dict)) # 输出结果: # OrderedDict([('x', 1), ('y', 2), ('z', 3)]) 打印有序的字典 # <class 'collections.OrderedDict'> print(order_dict.get('y')) # 都可以取到指定value # 输出结果:2 print(order_dict['y']) # 输出结果:2 for line in order_dict: print(line)
10.openpyxl模块
openpyxl模块:第三方模块 - 可以对Excle表格进行操作的模块
''' openpyxl模块:第三方模块 - 可以对Excle表格进行操作的模块 - 下载: pip3 install openpyxl - Excel版本: 2003之前: excle名字.xls 2003以后: excle名字.xlsx - 清华源: https://pypi.tuna.tsinghua.edu.cn/simple - 配置永久第三方源: D:\Python36\Lib\site-packages\pip\_internal\models\index.py ''' from openpyxl import Workbook # # 写入数据 # # 获取excel文件对象 wb_obj = Workbook() # # 建立工作表 wb1 = wb_obj.create_sheet('本月第一周销售明细表',1) wb2 = wb_obj.create_sheet('本月销售第二周明细表',2) # 修改工作表中的名字: print(wb1.title) # 将本月第一周销售明细表改为总明细表 wb1.title = '总明细表' print(wb1.title) # 为第一张工作表添加值 #方式: wb1['工作簿中的表格位置'] wb1['A10'] = 200 wb1['B10'] = 1000 wb1['C10'] = '=SUM(A10:B10)' wb_obj.save('本月销售明细表.xlsx') # 生成excel表格 # 读取数据 from openpyxl import load_workbook # 导入load_workbook wb_obj = load_workbook('本月销售明细表.xlsx') print(wb_obj) # 读取文件对象 wb1 = wb_obj['总明细表'] # 指定工作簿 print(wb1['A10'].value) # 取指定工作簿中的指定位置的值 # 输出结果:200 wb2 = wb_obj['本月销售第二周明细表'] print(wb2['A3'].value) # 批量写入数据 from openpyxl import Workbook wb_obj = Workbook() wb1 = wb_obj.create_sheet('记录表1') # wb1['表格位置'] = 对应的值 n = 1 for line in range(100): wb1['A%s'% n] = line + 1 n += 1 wb_obj.save('批量插入的数据1.xlsx') # 插入字典 dict1 = { 'name': 'tank', 'age': 17 } n = 1 for key, value in dict1.items(): wb1['A%s' % n] = key wb1['B%s' % n] = value n += 1 wb_obj.save('批量插入的数据2.xlsx')