json模块,pickle模块,collections模块,openpyxl模块,optparse模块
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')
11.optparse模块
一。什么是optparse模块
一个python的标准库,用于设计简单明了的符合标准unix命令的选项解析模块
二。怎么使用
内置标准库,不用下载
#常用解析命令选项
from optparse import OptionParse
from optparse import OptionParser
def runopt():
parser = OptionParser()
parser.add_option('-c','--complent',action='store',type='string',help='code classify')
parser.add_option('-f','--file',action='store',type='string',help='write report to file')
(options, args) = parser.parse_args()
print('1',options)
print('2',args)
runopt()
'''
python .\runoptparse.py -c llpc -f report.log
1 {'complent': 'llpc', 'file': 'report.log'}
2 []
'''