CSIC_716_20191118【常用模块的用法 Json、pickle、collections、openpyxl】 序列化模块 collections模块 openpyxl模块

序列化:将python或其他语言中的数据类型,转变成字符串类型。

python中的八大数据类型回顾:int float str list tuple dict set bool

反序列化:将字符串转变成其他数据类型。

json模块

json的跨平台性较好,是一个第三方模块。

在json中,所有的字符串都是双引号

元组通过json转变后,变成了列表,后续再解析的时候需要进行强制类型转化,才能变成元组

set是不支持转成json的

用法中的两点注意:dump(要存的内容,文件句柄),load(文件句柄)

# _*_ coding: gbk _*_
# @Author: Wonder
import json

str1 = '中国abc'
list1 = [1, 2, 3, 4]
dict1 = {'key': 'values', 'name': 'jack'}
tuple1 = ('a', 'b', 'c', 'd')
set1 = {1, 2, 3, 4, 5, 6, 7}

str_json = json.dumps(str1, ensure_ascii=False)
print(str_json)  # "中国abc"

tuple_obj = json.dumps(tuple1, ensure_ascii=False)
print(tuple_obj)  # ["a", "b", "c", "d"]
#
set_obj = json.dumps(set1, ensure_ascii=False)
print(set_obj)  # TypeError: Object of type set is not JSON serializable

dict1_obj = json.dumps(dict1)
print(dict1_obj)  # {"key": "values", "name": "jack"}

# 反序列化
tuple_ss = json.loads(tuple_obj)
real_tuple = tuple(tuple_ss)  # 将列表转为元组
print(real_tuple)  # ('a', 'b', 'c', 'd')

# 在打开文件的时候,可以通过dump和load直接操作文件
tuple1 = ('a', 'm', 'c', 'd')
f = open('user.json', 'w', encoding='utf-8')
t_obj = json.dumps(tuple1)
f.write(t_obj)
f.close()

#上述操作等价于用dump直接存文件
df = open('d_user.json', 'w', encoding='utf-8')
json.dump(tuple1, df)  #注意参数先写要写的内容,再写句柄f
json.dump(dict1, df)  #将内容分成两次往文件中存,会出现错误
df.close()
#直接用load取文件即可
df = open('d_user.json', 'r', encoding='utf-8')
ss = json.load(df)
print(ss)  # {'key': 'values', 'name': 'jack'}
df.close()

pickle模块

pickle模块是一个python自带的序列化模块

优点:可以支持python中所有的数据类型,也可以存bytes类型的数据。

缺点:只能在python平台中使用,局限性较大。

# 读桌面的图片文件
with open(r'C:UserswonderDesktoppicture.JPG', 'rb') as f:
    python_photo = f.read()
    print(python_photo)  # 一串二进制的字节流
    print(type(python_photo))  # bytes

# 存 pickle.dump
with open('teacher22.pickle', 'wb') as wf:
    pickle.dump(python_photo, wf)  # 存文件
# 取 pickle.load
with open('teacher22.pickle', 'rb') as rf:
    ss = pickle.load(rf)  # 读文件
    print(ss)  # 一串二进制的字节流

collections模块

collections模块提供了python八大数据类型以外的数据类型。主要介绍了两个模块:

具名元组 namedtuple 应用场景,坐标。

具名元组 namedtuple 的定义方式有三种

# _*_ coding: gbk _*_
# @Author: Wonder
from collections import namedtuple

# 定义方式 namedtuple(构造器,可迭代对象),可迭代对象可以是列表,空格分开的字符串,元组
# 第一种,
np1 = namedtuple('坐标1', 'xin yin')  # 在字符串中以空格区分元素个数
np2 = namedtuple('坐标2', ['xx', 'yy'])
np3 = namedtuple('坐标3', ('x', 'y'))
ss1 = np1(2, 3)  # 传参数的个数,要和可迭代对象中的个数相同
ss2 = np2(4, 5)
ss3 = np3(6, 7)
print(ss1)  # 坐标1(x=2, y=3)
print(ss2)  # 坐标2(xx=4, yy=5)
print(ss3)  # 坐标3(x=6, y=7)

有序字典 OrderedDict

from collections import OrderedDict

# OrderedDict与python中自带的dict定义方式一样,但他是一个有序的字典。即使两个OrderDict字典中键值对一样,在判断是否相等时也是False
or_dict = OrderedDict({'key1': 'value1', 'key2': 'value2'})
# 取值也和dict的取值方式一样
ss = or_dict.get('key2')
print(ss)
for k1, v1 in or_dict.items():
    print(k1, v1)

for v1 in or_dict.values():
    print(v1)

补充:向OrderDict中增加新的键值对时,可以指定增加在开头还是结尾。

or_dict = OrderedDict({'key1': 'value1', 'key2': 'value2', 'key3': 'value3'})
print(or_dict)  # OrderedDict([('key1', 'value1'), ('key2', 'value2'), ('key3', 'value3')])
or_dict.move_to_end('key2', last=False)  # last=True是默认参数,移动到最右边,此处已经设置为False
print(or_dict)  # OrderedDict([('key2', 'value2'), ('key1', 'value1'), ('key3', 'value3')])
or_dict.popitem(last=False)  #last=True 是默认参数的,弹出最右的元素,此处已经设置为False
print(or_dict)  # OrderedDict([('key1', 'value1'), ('key3', 'value3')])

有序列表也可以实现FIFO(先进先出)

openpyxl模块

保存一个Excel文件

# _*_ coding: gbk _*_
# @Author: Wonder
# 写入Excel文件
from openpyxl import Workbook
wb_obj = Workbook()  # 对象,最后以此wb_obj生成Excel文件
#下面的操作都是基于wb_obj对象进行
sheet1= wb_obj.create_sheet('python创建1', 0)  # 创建工作表并命名和指定是第几张)
sheet2 = wb_obj.create_sheet('python创建2', 1)  # title和第几页index
sheet1.title = 'py01修改'  # 修改名字
sheet1['A5'] = 100
sheet1['D5'] = 5
sheet1['B5'] = '=SUM(A5+D5)'  # Excel的函数
wb_obj.save('python创建的表格.xlsx')  # 通过最初创建的对象,保存生成文件。在此指定文件名

读取一个Excel文件,修改数据并另存为新文件

# 读取Excel数据,修改,保存
from openpyxl import load_workbook
from openpyxl import Workbook
#取到文件
wb_load_obj = load_workbook('python创建的表格.xlsx')
#取到工作表
sheeeet = wb_load_obj['python创建2']
#取到工作表中的值
c7 = sheeeet['C7'].value
print(c7)
# 修改指定的值
sheeeet['C7'] = 7777
#再存档
wb_load_obj.save('读取修改储存副本.xlsx')