模塊二之序列化模塊以及collections模塊
1、序列化模塊
'''
序列化:將python或其餘語言的數據類型轉換成字符串類型
json模塊: 是一個序列化模塊。
json:
是一個 「第三方」 的特殊數據格式。
能夠將python數據類型 ----》 json數據格式 ----》 字符串 ----》 文件中
其餘語言要想使用python的數據:
文件中 ----》 字符串 ----》 json數據格式 ----》 其餘語言的數據類型。
注意: 在json中,全部的字符串都是雙引號
# 元組比較特殊:
python中的元組,若將其轉換成json數據,內部會將元組 ---> 列表(變成可變類型)
# set是不能轉換成json數據
爲何要使用json:
- 爲了讓不一樣的語言之間數據能夠共享。
PS: 因爲各類語言的數據類型不一,但長相能夠同樣,
好比python不能直接使用其餘語言的數據類型,
必須將其餘語言的數據類型轉換成json數據格式,
python獲取到json數據後能夠將json轉換成pyton的數據類型。
如何使用:
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或其餘語言數據類型
- json.dump(): # 序列化: python數據類型 ---》 json ---》 字符串 ---》 json文件中
- 內部實現 f.write()
- json.load(): # 反序列化: json文件中 --》 字符串 ---》 json ---》 python或其餘語言數據類型
- 內部實現 f.read()
- dump, load: 使用更方便
注意: 保存json數據時,用.json做爲文件的後綴名
'''
import json
#列表
list = ['亞峯', '小明', '熱巴']
#dumps是序列化:將python數據(或其餘語言)---->json數據格式------>字符串
#ensure_ascii默認是True
json_str = json.dumps(list)
print(json_str)
>>>["\u4e9a\u5cf0", "\u5c0f\u660e", "\u70ed\u5df4"]
#
#
#ensure_ascii=Falise可經過這種方式實現原有的樣子
json_str = json.dumps(list, ensure_ascii=False)
print(json_str)
>>>["亞峯", "小明", "熱巴"]
print(type(json_str))
>>><class 'str'>
#
#
#loads是反序列化:字符串----->json數據格式------->python數據(其餘語言)
python_data = json.loads(json_str)
print(python_data)
>>>['亞峯', '小明', '熱巴']
print(type(python_data))
>>><class 'list'>
#元祖
tuple1 = ('亞峯', '小明', '熱巴')
json_str = json.dumps(tuple1)
print(json_str)
>>>["\u4e9a\u5cf0", "\u5c0f\u660e", "\u70ed\u5df4"]
json_str = json.dumps(tuple1, ensure_ascii=False)
print(json_str)
>>>["亞峯", "小明", "熱巴"]在json中""表明字符串
print(type(json_str))
>>><class 'str'>
#
python_data = json.loads(json_str)
print(python_data)
>>>['亞峯', '小明', '熱巴']
print(type(python_data))
>>><class 'list'>
#
#
#字典
dic = {
'name': 'yafeng',
'age': '18'
}
json_str = json.dumps(dic)
print(json_str)
>>>{"name": "yafeng", "age": "18"}
print(type(json_str))
>>><class 'str'>
json_str = json.dumps(dic, ensure_ascii=False)
print(json_str)
>>>{"name": "yafeng", "age": "18"}
#
#
python_obj = json.loads(json_str)
print(python_data)
>>>['亞峯', '小明', '熱巴']
print(type(python_data))
>>>['亞峯', '小明', '熱巴']
#
#
# #****注意集合是不能被序列化成json****
set1 = {1, 2, 3, 4}
json_str = json.dumps(set1)
print(json_str)
>>>TypeError: Object of type set is not JSON
>>>serializable(序列化)
#註冊功能
# def register():
# username = input('請輸入您的姓名:').strip()
# password = input('請輸入您的密碼:').strip()
# re_password = input('請確認您的密碼:').strip()
# if password == re_password:
# user_dic = {
# 'name': 'username',
# 'pwd': 'password'
# }
# json_str = json.dumps(user_dic, ensure_ascii=False)
#
# #開始寫入文件
# #保存json數據時,用.json作後綴
# with open('user.json','w',encoding='utf-8')as f:
# f.write(json_str)
#
# register()
#dump,load的用法
import json
user_dic = {
'name': 'yafeng',
'age': 18
}
with open('user1.json', 'w', encoding='utf-8')as f:
json.dump(user_dic, f)#先open,在write
with open('user2.json', 'w', encoding='utf-8')as f:
json.dump(user_dic, f)
with open('user2.json', 'r', encoding='utf-8')as f:
user_dic = json.load(f)
print(user_dic)
print(type(user_dic))
#>>>{'name': 'yafeng', 'age': 18}
#>>><class 'dict'>
'''
pickle模塊:
pickle是一個python自帶的序列化模塊。
優勢:
- 能夠支持python中全部的數據類型(集合也行)
- 能夠直接存 "bytes類型" 的數據,pickle存取速度更快
缺點: (致命的缺點)
- 只能支持python去使用,不能跨平臺
'''
import pickle
dic = {
'name': 'yafeng',
'age': '18',
'love': '熱巴'
}
#轉換成序列化dump(bytes)
with open('yafeng.pickle', 'wb')as f:
pickle.dump(dic, f)
#讀換成原來的
with open('yafeng.pickle', 'rb')as f:
python_dic = pickle.load(f)#注意load只能加載一個對象
print(python_dic)
#>>>{'name': 'yafeng', 'age': '18', 'love': '熱巴'}
print(type(python_dic))
#>>><class 'dict'>
set1 = {'yafeng', '18', '熱巴'}
with open('1.pickle', 'wb')as f:
pickle.dump(set1, f)
with open('1.pickle', 'rb')as f:
python_set = pickle.load(f)
print(python_set)
#>>>{'18', '熱巴', 'yafeng'}
print(type(python_set))
#>>><class 'set'>
2、collections 模塊
'''
- python默認八大數據:
- 整型
- 浮點型
- 字符串
- 字典
- 元組
- 列表
- 集合
- 布爾
collections模塊:
- 提供一些python八大數據類型 「之外的數據類型」 。
- 具名元組:
具名元組 只是一個名字。
應用場景:
- 座標
-
from collections import namedtuple
- 有序字典:
- python中字典默認是無序
- collections中提供了有序的字典
from collections import OrderedDict
'''
#具名元組
from collections import namedtuple
#傳入的可迭代對象是有序的便可索引取值(好比列表,元組,字符串)
#應用1:座標
#將‘座標’變成‘對象’的名字
point = namedtuple('座標', ['x', 'y'])#此時的第二個參數既能夠傳可迭代對象
point = namedtuple('座標', ('x', 'y'))#此時的第二個參數既能夠傳可迭代對象
point = namedtuple('座標', 'x y')#此時的第二個參數既能夠傳可迭代對象,注意字符串中的每一個元素之間必須以空格隔開
#傳參的個數要與第二個參數的個數一致
p = point(1, 2)
print(p)
#座標(x=1, y=2)
print(type(p))
#<class '__main__.座標'>
#應用二、撲克牌
#獲取撲克牌對象
card = namedtuple('撲克牌', ['color', 'number'])#此時就是撲克牌對象
#由撲克牌對象產生一張 撲克牌
red_A = card('❤', 'A')
print(red_A)
#>>>撲克牌(color='❤', number='A')
print(type(red_A))
#>>><class '__main__.撲克牌'>
black_k = card('♠', 'K')
print(black_k)
#>>>撲克牌(color='♠', number='K')
print(type(black_k))
#>>><class '__main__.撲克牌'>
#應用三、影片的信息
p = namedtuple('島國', ['city', 'movie_type', 'name'])
movie_info = p('東京', '愛情動做片', 'cang老師')
print(movie_info)
#>>>島國(city='東京', movie_type='愛情動做片', name='cang老師')
print(type(movie_info))
#>>><class '__main__.島國'>
#二、有序字典
#python中默認字典是無序的*****很重要******
dic = {
'name': 'yafeng',
'age': 18,
'love': '熱巴'
}
print(dic)
#>>>{'name': 'yafeng', 'age': 18, 'love': '熱巴'}
print(type(dic))
#>>><class 'dict'>
for i in dic:
print(i)
#>>>name
#>>>age
#>>>love
#有序字典
from collections import OrderedDict
order_dic = OrderedDict(dic)
print(order_dic)
#>>>OrderedDict([('name', 'yafeng'), ('age', 18), ('love', '熱巴')])
print(type(order_dic))
#>>><class 'collections.OrderedDict'>
print(order_dic.get('love'))
#>>>熱巴
print(order_dic['love'])
#>>>熱巴
for i in order_dic:
print(i)
#name
#age
#love
3、openpyxl模塊
- openpyxl(可對ecxel表格進行操做的模塊)
# '''
# openpyxl模塊:第三方模塊
# - 能夠對Excle表格進行操做的模塊
#
# - 下載:
# pip install openpyxl
#
# - Excel版本:
# 2003以前:
# excle名字.xls
#
# 2003之後:
# excle名字.xlsx
#
# - 清華源: https://pypi.tuna.tsinghua.edu.cn/simple
#
# - 配置永久第三方源:
# D:C:\Users\佔亞峯\AppData\Local\Programs\Python\Python37\Lib\site-packages\pip\_internal\models\index.py
# '''
# #寫入數據
# from openpyxl import Workbook
#
# #獲取Excel文件對象
# wb_obj = Workbook()
#
# wb1 = wb_obj.create_sheet('亞峯牛皮1', 1)
# wb2 = wb_obj.create_sheet('亞峯牛皮2', 2)
#
# #修改工做表名字,將'亞峯牛皮2'修改爲---->'亞峯666'
# print(wb2.title)
# wb2.title = '亞峯666'
# print(wb2.title)
#
#
# #爲第一張工做表中添加值
# #wb1['工做簿中的表格位置']
# wb1['A10'] = 123
# wb1['B10'] = 666
# wb1['C10'] = '=SUM(A10:B10)'
#
# #生成Excel表格
# wb_obj.save('亞峯牛皮1.xlsx')
# print('excel表格生成成功')
# #讀取數據
# from openpyxl import load_workbook
# wb_obj = load_workbook('亞峯1.xlsx')
# print(wb_obj)
#
# #wb_obj['表名']
# wb1 = wb_obj['亞峯牛皮1']
# print(wb1['A10'].value)
# wb1['A10'] = 666
# print(wb1['A10'].value)
#批量寫入100條數據
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
#假設:一萬條數據的字典
dic = {
'name': '亞峯',
'age': 18,
'love': '熱巴'
}
n = 1
for key, value in dic.items():
wb1['A%s' %n] = key
wb1['B%s' %n] = value
n += 1
wb_obj.save('批量插入的數據.xlsx')