day19 python
 
一.序列化模块
    序列类型: 列表 字符串 元组 bytes
    序列化: 特指字符串和bytes, 就是把其他的数据类型转化成序列的数据类型的过程
dic = {'1','2'}
print(str(dic))     #这就是序列化
    1.为什么要把其他数据类型转成字符串: 一.能在网络上传输的只能是bytes, 能存在文件里的只有bytes和str(本质都是bytes)
                                        二.字符串就可以传输,但是dic格式的处理起来更方便, 处理字符串的成本高
    2.倒是能用str()搞, 但是咋搞回来呢?: 用eval可以搞回来, 但eval不专业, 应为他是执行,(执行的什么都很危险)
lst = str([1,2,3])
print(lst, type(lst))   #[1, 2, 3] <class 'str'>
rst = eval(lst)
print(rst, type(rst))   #[1, 2, 3] <class 'list'>
rst=eval('[1,2,3]')
print(rst, type(rst))   #[1, 2, 3] <class 'list'>
        
二.json模块
import json
dic = {'name':"bajie", 'age':66}
 
rst = json.dumps(dic)                   #序列化
print(dic, type(dic))                   #{'name': 'bajie', 'age': 66} <class 'dict'>    #python中的引号: 单引号
print(rst, type(rst))                   #{"name": "bajie", "age": 66} <class 'str'>     #json中的引号: 双引号
 
dic = json.loads(rst)                   #反序列化
print(dic, type(dic))                   #{'name': 'bajie', 'age': 66} <class 'dict'>
    
    问题1
dic = {'name':"bajie", 22:66}           #当key是int时, json时会把int改成str, 且永远是str类型
rst = json.dumps(dic)
print(rst, type(rst))
        
    问题2
dic = {'name': [1,2,3], 22: (4,5,6)}
rst = json.dumps(dic)
print(rst, type(rst))                   #当value是元组时, json时会把元组改成列表, 且永远是列表类型
        
    问题3
set1 = {1,2,3,'bajie'}
rst = json(set1)                        #json 搞不了集合
        
    问题4
dic = {(1,2,3):1, 3:4}                  #元组不能做key, 否则json不能序列化
rst = json.dumps(dic)
        
    json总结:
json能处理的数据类型非常有限: 字符串, 数字, 列表, 字典(key只能是: 字符串和数字(数字会强转成字符串), value中的元组会被强转成列表)
为什么支持的这么少: 因为它要在所有的语言中通信用, 要用的数据格式是大家都支持的.在python中序列化之后, 在其他的语言都可以反序列化
 
import json
 
dic = {'name':"bajie", 'age':66}
rst = json.dumps(dic)
 
with open('json_file','w') as f:     #手动往json串中加key,value,也可以, 但是要都加双引号""
    f.write(rst+'\n')
 
with open('json_file', 'r') as f:
    data = f.readline()
    dic = json.loads(data)
    print(dic)
        
    json模块: dump和load: 和dumps, loads(操作内存的)一样, 但是可以直接操作文件,不能多次load和dump: 只能搞一次
import json
 
dic = {'name':"bajie", 'age':66}
 
with open('json_file','w') as f:    #手动往json串中加key,value,也可以, 但是要都加双引号""
    json.dump(dic, f)
 
with open('json_file', 'r') as f:
    dic = json.load(f)
    print(dic)
        
    问题5: 可以往文件中多次dumps, 但是loads取的时候只能每行是一个数据类型才行,
import json
dic = {'name':'bajie','age':60}
with open('json_o', 'a') as f:
    rst = json.dumps(dic)
    for i in range(5):
        f.write(rst+'\n')
with open('json_o', 'r') as f:
    for line in f:
        print(json.loads(line))
        
    json模块: 编码问题
import json
dic = {'name':'八戒'}
print(json.dumps(dic,ensure_ascii=False))               #不用编码, 原样输出
 
print(json.loads(json.dumps(dic,ensure_ascii=False)))   #ensure_ascii 不影响loads的结果
print(json.loads(json.dumps(dic)))                      #loads 的结果是一样的
        
    json模块: dumps时的格式化输出
import json
data = {'name':'bajie', 'age':['name','datang','name','八戒']}
json_data = json.dumps(data, sort_keys=True, indent=2, separators=(',',':'),ensure_ascii=False)
#                       要根据key去排序 - 每次换行前面几个空格 - 指定要格式化的符号 #一般存和传的时候不用, 只有当你想看, 才看一看
print(json_data)
 
三.pickle模块
import pickle
dic = {(1,2,3):{'a','b'}, 1:'abc'}      #这些数据类型json处理不了, 那么就用pickle
 
rst = pickle.dumps(dic)     #1.和json不同, 结果是bytes.(而且这种bytes, decode不了, 只能用pickle的load去还原)
 
dic = pickle.loads(rst)     #2.和json不同, 用loads还原回来的都是之前的东西(也就是说几乎所有的数据类型它都支持)
 
print(dic)                  #3.和json不同, 只能在python中使用
print(rst)
    
    pickle模块: load和dump, 和json一样也是和文件操作配合的
with open('dump_file','wb') as f:         #4.和json不同, 打开文件的时候要有b,因为是bytes类型
    pickle.dump("\n%s" % dic, f)
    pickle.dump("\n%s" % dic, f)          #5.和json不同,可以多次dump, 而且dump时候不用加\n, 打印是会多出一空行
    pickle.dump("%s" % dic, f)
    pickle.dump("%s" % dic, f)
 
with open('dump_file','rb') as f:         #4.和json不同, 打开文件的时候要有b,因为是bytes类型
    rst = pickle.load(f)
    print(rst, type(rst))
    rst = pickle.load(f)                  #5.和json不同,也可以多次load, load一次取一次dump的结果, 取完再取会报错
    print(rst, type(rst))
    rst = pickle.load(f)
    print(rst, type(rst))
 
with open('dump_file','rb') as f:
    while True:
        try:                              #5.把load的报错, 进行异常处理
            rst = pickle.load(f)
            print(rst, type(rst))
        except EOFError:
            break
 
 
 
 
 
    练习
        1.写一个函数,接收一个参数, 如果是文件, 就执行这个文件,如果是文件夹就执行这个文件夹下所有的py文件
import os
def func(filepath):
    if os.path.isfile(filepath) and filepath.endswith(".py"):
        os.system("python %s" % filepath)
    if os.path.isdir(filepath):
        for name in os.listdir(filepath):
            file_path = os.path.join(filepath, name)
            if os.path.isfile(file_path) and file_path.endswith('.py'):
                os.system("python %s" % file_path)
func(r'C:\Users\THINKPAD\PycharmProjects\s15\day02')
func(r'C:\Users\THINKPAD\PycharmProjects\s15\day02\forsum.py')
 
        
        2.写一个copy函数,接收两个参数,src dst文件, 然后将源文件copy到目标位置
import os
 
def copy(sfile, dpath):
    s_filename = os.path.basename(sfile)
    if os.path.isfile(s_filename) and os.path.isdir(dpath):
        d_filename = os.path.join(dpath,s_filename)
        if os.path.isfile(d_filename):
            print('%s is exist' % d_filename)
            os.rename(d_filename,"%s.bak" % d_filename)
        with open(sfile, mode='rb') as f1, open((d_filename), mode='wb') as f2:
            for line in f1:
                f2.write(line)
 
copy(r'C:\Users\THINKPAD\PycharmProjects\s15\day02\format.py', r'C:\Users\THINKPAD\PycharmProjects\s15\day01')
 
        
        3.获取某个文件所在目录的上一级目录
print(os.path.dirname(os.path.dirname(r'C:\Users\THINKPAD\PycharmProjects\s15\day01')))
 
        4.使用os模块创建如下目录结构
        glance
            __init__.py
            api
                __init__.py
                policy.py    
                versions.py
            cmd
                __init__.py
                manage.py
            db    
                __init__.py
                model.py
import os
os.makedirs('glance/api')
os.makedirs('glance/cmd')
os.makedirs('glance/db')
 
open('glance/__init__.py',mode='w').close()
open('glance/api/__init__.py',mode='w').close()
open('glance/api/policy.py',mode='w').close()
open('glance/api/versions.py',mode='w').close()
open('glance/cmd/__init__.py',mode='w').close()
open('glance/cmd/manage.py',mode='w').close()
open('glance/db/__init__.py',mode='w').close()
open('glance/db/model.py',mode='w').close()
 
        
        5.写一个用户注册的程序, 每个用户注册都要把用户名和密码用字典的格式写入文件userinfo, 在登录的时候,在从文件中读取信息进行验证
import pickle
 
def regist():
    if not os.path.isfile('userinfo'):
        open('userinfo','w').close()
    user = input('user: ')
    password = input('password ')
    dic = {'user':user,'password':password}
    with open('userinfo', 'rb+') as f:
        while True:
            try:
                f_dic = pickle.load(f)
                if user in f_dic['user']:
                    print('user: %s is exists!')
                    break
                else:
                    f.seek(0,2)
                    pickle.dump(dic, f)
            except:
                break
def login():
    user = input('user: ')
    password = input('password ')
    dic = {'user': user, 'password': password}
    flags = False
    with open('userinfo', 'rb') as f:
        while True:
            try:
                f_dic = pickle.load(f)
                if user == f_dic['user'] and password == f_dic['password']:
                    print('successful!')
                    flags = True
                    return
            except:
                break
    if flags == False:
        print('incurrent!')
def view():
    with open('userinfo', 'rb') as f:
        while True:
            try:
                f_dic = pickle.load(f)
                print(f_dic)
            except:
                break
cmds = {'0':regist,'1':login,'3':view}
while True:
    prompt = '''    
    (0)regist
    (1)login
    (2)quit
    (3)view
    please give me your choice(0/1/2/3): '''
    choice = input(prompt)
    if choice == '2':
        break
    cmds[choice]()
 
       
        #6.发红包
import random
def hand_red(num, money):
    money = money * 100                  #把元单位换成分, 这样就不涉及小数了
    lst = random.sample(range(1,money),num-1)
    lst.append(0)
    lst.append(money)
    lst.sort()
 
    new_lst = []
    for i in range(len(lst)-1):
        yield ((lst[i+1]-lst[i])/100)    #把分转换回元为单位, 然后返回的是生成器, 可以让你抢一个,生一个
 
rst = hand_red(9,100)
for i in rst:
    print(i)
 
       
 
 
 
 
 
 
 

day19 python模块 json模块 pickle模块的更多相关文章

  1. python(6)- json和pickle模块

    这是用于序列化的两个模块: json: 用于字符串和python数据类型间进行转换 pickle: 用于python特有的类型和python的数据类型间进行转换 Json模块提供了四个功能:dumps ...

  2. python基础-json、pickle模块

    json.pickle区别 总结: """ json: 1.不是所有的数据类型否可以序列化,序列化返回结果为字符串 2.不能多次对同一文件序列化 3.json数据可以跨语 ...

  3. python之json、pickle模块

    一.json模块 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候, ...

  4. python 之 json 与pickle 模块

    序例化:将对象转换为可通过网络传输或可以存储到本地磁盘的数据格式(如:XML.JSON或特定格式的字节串)的过程称为序列化:反之,则称为反序列化. 1.[JSON] import json dic={ ...

  5. python值json与pickle模块

    #json 是用来序列化对象的 # 只有2个方法,序列化与反序列化 # 但是不能序列化类 与 函数 import json dict={"key1":[1,2,3,4,5]} f ...

  6. os模块,sys模块,json和pickle模块,logging模块

    目录 OS模块 sys模块 json和pickle模块 序列化和反序列化 json模块 pickle logging模块 OS模块 能与操作系统交互,控制文件 / 文件夹 # 创建文件夹 import ...

  7. 模块讲解---os模块,sys模块,json和pickle模块,logging模块

    目录 模块的用法 os模块 常用的功能 sys模块 常用的功能 json和pickle模块 4. logging模块 模块的用法 通过 import 或者from......import...... ...

  8. python模块(json和pickle模块)

    json和pickle模块,两个都是用于序列化的模块 • json模块,用于字符串与python数据类型之间的转换 • pickle模块,用于python特有类型与python数据类型之间的转换 两个 ...

  9. Python json和pickle模块

    用于序列化的两个模块 json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 Json模块提供了四个功能:dumps. ...

  10. Python之时间模块、random模块、json与pickle模块

    一.时间模块 1.常用时间模块 import time # 时间分为三种格式 #1.时间戳---------------------以秒计算 # start= time.time() # time.s ...

随机推荐

  1. Flask学习笔记01之环境搭建

    使用pycharm搭建Flask运行环境 1. 打开pycharm ,创建一个新的工程 2. 选择创建Flask项目 3. Flask项目创建成功,结构如下 4. 运行项目 5. 发送请求 over!

  2. 图片没有.png或者jpg后缀能不能加载?

    是可以的,如:http://mmbiz.qpic.cn/mmbiz_png/MW1VecOrnw6HUMvEUNUxibLVtbY2vHF8QkFyviaickh8pnsapQ8gOosdq13SBX ...

  3. HY 的惩罚 (Trie 树,博弈论)

    [问题描述] hy 抄题解又被老师抓住了,现在老师把他叫到了办公室. 老师要 hy 和他玩一个游 戏.如果 hy 输了,老师就要把他开除信息组; 游戏分为 k 轮.在游戏开始之前,老师会将 n 个由英 ...

  4. FFT IP核调用与仿真之FFT数学分析

    对于FFT这个IP核,我其实对它真的是又爱又恨,因为它真的耗费了我太多时间,但是随着研究的深入,遇到的问题一点点给消化解决,终于不用带着问题睡觉了,哈哈,有时候真的挺佩服自己的,遇到不懂的,不了解的, ...

  5. C++ 得到系统时间

    Time::Time() {//得到系统时间 初始化 time_t t; t=time(NULL); tm *lt; lt=localtime(&t); hour=lt->tm_hour ...

  6. [hadoop](3) MapReduce:创建计数器、任务状态和写入日志

    前言 本章主要讲述了如何在mapreduce任务中添加自定义的计数器,从所有任务中聚合信息,并且最终输出到mapreduce web ui中得到统计信息. 准备工作 数据集:ufo-60000条记录, ...

  7. nginxUbuntu安装Nginx和正确卸载Nginx Nginx相关 与Nginx报错:nginx: [error] invalid PID number "" in "/run/nginx.pid" 解决方法

    https://www.cnblogs.com/zhaoyingjie/p/6840616.html https://blog.csdn.net/adley_app/article/details/7 ...

  8. RichEdit 学习

    procedure TForm1.AddText(RichEdit: TRichEdit; Str: string; TextColor: TColor = clBlack; FontName: st ...

  9. C# 加密解密类

    一. MD5  1 防止看到明文 数据库密码,加盐(原密码+固定字符串,然后再MD5/双MD5)  2 防篡改   3 急速秒传(第一次上传文件,保存md5摘要,第二次上传检查md5摘要)   4文件 ...

  10. git团队协作代码提交步骤

    我们公司由五个人同时开发一个项目,大佬建好仓库后叫我们统一提交到dev这个分支,我的分支是hardy,你们只要将这两个值改成你们团队协作中使用的分支即可.代码如下: git add . git com ...