Title

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 []
'''
posted @ 2019-11-18 21:10  Mr江  阅读(98)  评论(0编辑  收藏  举报