模塊二之序列化模塊以及collections模塊

模塊二之序列化模塊以及collections模塊

1、序列化模塊

  • json模塊
'''
序列化:將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模塊:
    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')
相關文章
相關標籤/搜索