zoukankan      html  css  js  c++  java
  • python-json-pickle-shelve-random-os-sys-hashlib

    json模块

      JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。JSON的数据格式其实就是python里面的字典格式,里面可以包含方括号括起来的数组,也就是python里面的列表。
    json中四种方法:

    • dumps:将数据类型(字典,列表)转换为字符串
    • loads:将字符串转换为数据类型
    • dump:将数据类型转化为字符串存储的文件中
    • load:将文件中的字符串转换为数据类型

    dumps和loads

    d = json.dumps({"a": 123, "b": "123"}) # 序列化:将字典转化为字符串
    print(d, type(d))  # {"a": 123, "b": "123"} <class 'str'>
    res = json.loads(d)  # 反序列化:将字符串转化为字典
    res["a"] = 456  # 修改字典的值
    print(res, type(res))  #  {'a': 456, 'b': '123'} <class 'dict'>
    list_dic = [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]
    
    str_list = json.dumps(list_dic)
    
    print(str_list,type(str_list))  # [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}] <class 'str'>
    
    list_str = json.loads(str_list)
    print(list_str, type(list_str))  # [1, ['a', 'b', 'c'], 3, {'k1': 'v1
    

    dump和load

    d = json.dump({"a": 123}, open('a', 'w', encoding='utf-8'))  # 序列化 将字典转化为字符串之后存储在文件a中
    # 具有持久化  存储在文件中
    d1 =json.load(open("a",'r', encoding='utf-8')  # 反序列化  将文件中的字符串转换为字典 
    print(d1, type(d1))  # {'a': 123} <class 'dict'>
    
    # json格式化输出
    data = {'username': ['李华', '二愣子'], 'sex': 'male', 'age': 16}
    json_dic2 = json.dumps(data, sort_keys=True, indent=2, separators=(',', ':'), ensure_ascii=False)
    print(json_dic2)
    
    '''输出格式
    {
       "age":16,
       "sex":"male",
       "username":[
          "李华",
          "二愣子"
       ]
    }
    
    '''
    

    pickle模块

      json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 pickle模块提供了四个功能:dumps、dump(序列化,存)、loads(反序列化,读)、load (不仅可以序列化字典,列表...可以把python中任意的数据类型序列化)pickle是python特有的模块.

    import pickle
    dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
    p = pickle.dumps(dic)  # 序列化 返回来的是一串类似于二进制
    print(p, type(p))   # b'x80x03}qx00(Xx02x00x00x00k1qx01Xx02x00x00x00v1qx02Xx02x00x00x00k2qx03Xx02x00x00x00v2qx04Xx02x00x00x00k3qx05Xx02x00x00x00v3qx06u.' <class 'bytes'>
    p1 = pickle.loads(p)  # 反序列化
    print(p1) # {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
    
    d = pickle.dump(dic,open('a', 'wb'))  # 序列化 将字典转化为类似二进制文件存储在文件中
    d1 = pickle.load(open('a', 'rb'))
    print(d1)  # {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
    }
    
    

    总结:

    json模块里的dumps是将python的数据结构转换成字符串,loads是将字符串类型转换成python的数据结构
    ​
    json模块里的dump是将python的数据结构转换成字符串,然后存入到文件当中
    ​
    json模块里的loads是将文件中字符串类型转换成python的数据结构
    ​
    pickle模块里的dump是将python的数据结构转换成二进制的文件,loads是将二进制的文件转换成python的
    ​
    数据结构
    ​
    pickle模块里的dump是将python的数据结构转换成二进制然后存入到文件中
    ​
    pickle模块里的load是将文件中的二进制文件转成python的数据结构
    
    

    shelve模块

    import shelve
    
    f = shelve.open('c')# 将会生三个文件c.bak,c.dat,c.dir
    f["name"] = "Tom"  # 操作和字典一样
    f["age"] = 1000
    print(f["name"])  # Tom
    print(f['age'])  # 1000
    
    for i in f.items():
        print(i, end=' ')  # ('name', 'Tom') ('age', 1000)
    
    for i in f.keys():
        print(i, end=" ")  # name age
    
    for i in f.values():
        print(i, end=' ')  # Tom 1000
    
    

    random模块

    import random
    
    # 产生0<x<1的随机数  浮点数
    
    ret = random.random()
    print(ret)  # 0.2811136727298186
    
    # 参数一定范围的随机数
    
    ret1 = random.randint(1, 10)  # 是包含前后的范围的,整数
    print(ret1)  # 4
    
    ret2 = random.randrange(1, 10, 2)  # 前后都不包含,可以加步长 产生1-10之间的整数
    print(ret2)  # 5
    
    ret3 = random.choice([1, 2, 3, 4, 5])  # 在列表中随机选择 对应不能索引的数据类型(set,dict)在不能进行此操作
    print(ret3)  # 1
    
    ret4 = random.choices([1, 2, 3, 4, 5], k=2)  # 在列表中选取多个数据,且可以重复出现
    
    print(ret4)  # [3, 5]
    
    ret5 = random.sample([1, 2, 3, 4, 5], k=2)  # 在列表中选取多个数据,且不会重复出现
    print(ret5)  # [4, 3]
    
    a = [1, 2, 3, 4, 5]
    random.shuffle(a)  # 随机打乱,洗牌操作
    print(a)  # [3, 1, 4, 5, 2]
    
    ret6 = random.uniform(1, 3)   # 生成一定范围的浮点数
    print(ret6)  # 2.0001839915476123
    

    os模块

    os模块是与操作系统交互的接口

    和文件夹操作

    import os
    
    os.makedirs("python/bin")  # 可生成多层递归目录
    
    os.removedirs("python/bin")  # 若目录为空,则删除,并递归到上一节目录,若为空,则删除,以此类推
    
    os.mkdir("dirname")  # 创建单级目录
    
    os.rmdir("dirname")  # 删除单级目录
    
    ret = os.listdir(r'F:oldboy_codeday_13')  #  列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
    print(ret)  
    

    和文件先关

    import os
    os.remove("c.bak")  # 删除一个文件
    os.rename('old_name','new_name')  # 重命名文件/目录
    ret = os.stat(r'F:oldboy_codeday_13a')  # 获取文件/目录信息
    print(ret)
    '''
    os.stat_result(st_mode=33206, st_ino=14073748835640376, st_dev=3026493691, st_nlink=1, st_uid=0, st_gid=0, st_size=62, st_atime=1552982111, st_mtime=1552982111, st_ctime=1552963154)
    '''
    
    
    
    

    和操作系统差异相关

    >>> os.sep  #  输出操作系统特定的路径分隔符,win下为"\",Linux下为"/"
    '\'
    >>> os.linesep # 输出当前平台使用的行终止符,win下为"
    ",Linux下为"
    "
    '
    '
    >>> os.pathsep  # 输出用于分割文件路径的字符串 win下为;,Linux下为:
    ';'
    >>> os.name  # 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
    'nt'
    

    和执行命令相关

    os.system("bash command")  运行shell命令,直接显示
    os.popen("bash command).read()  运行shell命令,获取执行结果
    os.environ  获取系统环境变量
    

    path系列和路径相关

    os.path.abspath(path) 返回path规范化的绝对路径
    os.path.split(path) 将path分割成目录和文件名二元组返回
    os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
    os.path.basename(path) 返回path最后的文件名。如何path以/或结尾,那么就会返回空值,即os.path.split(path)的第二个元素。
    os.path.exists(path)  如果path存在,返回True;如果path不存在,返回False
    os.path.isabs(path)  如果path是绝对路径,返回True
    os.path.isfile(path)  如果path是一个存在的文件,返回True。否则返回False
    os.path.isdir(path)  如果path是一个存在的目录,则返回True。否则返回False
    os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
    os.path.getatime(path)  返回path所指向的文件或者目录的最后访问时间
    os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间
    os.path.getsize(path) 返回path的大小<br></em>
    
    os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
    os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd
    os.curdir  返回当前目录: ('.')
    os.pardir  获取当前目录的父目录字符串名:('..')
    

    测试:

    import os
    
    os.remove("c.bak")  # 删除一个文件
    os.rename('old_name','new_name')  # 重命名文件/目录
    ret = os.stat(r'F:oldboy_codeday_13a')
    print(ret)
    ret = os.path.abspath('homework13')  # 相对路径 获取到绝对路径
    print(ret)  # F:oldboy_codeday_13homework13
    
    ret1 = os.path.split(r'F:oldboy_codeday_13')
    print(ret1)  # ('F:\oldboy_code\day_13', 'b')   # 将绝对路径分为目录和文件
    
    ret2 = os.path.dirname(r'F:oldboy_codeday_13')
    print(ret2)  # F:oldboy_codeday_13  获取文件的目录
    
    ret3 = os.path.basename(r'F:oldboy_codeday_13')
    print(ret3)  # b 获取文件名
    
    ret4 = os.path.isabs('b')  # 判断是不是绝对路径
    print(ret4)  # False
    
    ret5 = os.path.exists("a")  # 判断路径是否存在
    print(ret5)  # True
    
    ret6 = os.path.isfile('a')  # 如果存在一个文件,返回true 否则是False
    print(ret6)
    
    ret7 = os.path.join('C:\', 'app', 'a', 'b')
    print(ret7)  # C:appa
    
    ret8 = os.path.getsize('a')  # 获取文件的大小
    print(ret8)
    

    os.stat('path/filename') 获取文件/目录信息 的结构说明

    stat 结构:
    st_mode: inode 保护模式
    st_ino: inode 节点号。
    st_dev: inode 驻留的设备。
    st_nlink: inode 的链接数。
    st_uid: 所有者的用户ID。
    st_gid: 所有者的组ID。
    st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。
    st_atime: 上次访问的时间。
    st_mtime: 最后一次修改的时间。
    st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。
    

    sys模块

    sys模块是与python计解释器交互的一个接口

    sys.argv           命令行参数List,第一个元素是程序本身路径
    sys.exit(n)        退出程序,正常退出时exit(0),错误退出sys.exit(1)
    sys.version        获取Python解释程序的版本信息
    sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
    sys.platform       返回操作系统平台名称
    

    测试

    >>> import sys
    >>> sys.version
    '3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 10:22:32) [MSC v.1900 64 bit (AMD64)]'
    >>> sys.path
    ['', 'G:\Sofeware\Anaconda\python36.zip', 'G:\Sofeware\Anaconda\DLLs', 'G:\Sofeware\Anaconda\lib', 'G:\Sofeware\Anaconda', 'G:\Sofeware\Anaconda\lib\site-packages', 'G:\Sofeware\Anaconda\lib\site-packages\win32', 'G:\Sofeware\Anaconda\lib\site-packages\win32\lib', 'G:\Sofeware\Anaconda\lib\site-packages\Pythonwin']
    >>> sys.platform
    'win32'
    >>> sys.argv
    ['']
    >>> sys.exit(0)
    
    

    hashlib模块

      hashlib是常见的摘要算法,摘要算法,通过摘要函数f()对任意长度的数据data计算出固定的长度的摘要digest,目的是为了发现原始数据是否被人篡改过。
      摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。
    也md5进行测试

    import hashlib
    
    md5 = hashlib.md5()  # 速度快,现在不安全了, 也被破解
    
    md5.update("password".encode('utf-8'))
    print(md5.hexdigest())  # 5f4dcc3b5aa765d61d8327deb882cf99
    
    
    sh = hashlib.sha3_512()  # 比md5更加的安全 但是速度慢
    sh.update('password'.encode('utf-8'))
    print(sh.hexdigest())  # e9a75486736a550af4fea861e2378305c4a555a05094dee1dca2f68afea49cc3a50e8de6ea131ea521311f4d6fb054a146e8282f8e35ff2e6368c1a62e909716
    
    
    # 加盐操作
    
    md5 = hashlib.md5("盐".encode('utf-8'))  # 加盐在操作
    md5.update('password'.encode('utf-8'))
    print(md5.hexdigest())  # fffe343da367b45368df0f90391812b6  加盐操作和不加盐操作的秘文是不一样的
    
    
    # 简单的运用
    import hashlib
    username1 = 'Yang'
    password1 = '123'
    
    md5 = hashlib.md5(username1.encode('utf-8'))
    md5.update(password1.encode('utf-8'))
    code_name_password = md5.hexdigest()
    print(code_name_password)
    
    
    username = input("name:").strip()
    password = input("password:").strip()
    md5 = hashlib.md5(username.encode('utf-8'))
    md5.update(password.encode('utf-8'))
    code_name_password1 = md5.hexdigest()
    if code_name_password1 == code_name_password:
        print("登录成功")
    
  • 相关阅读:
    WEB上传大文件
    Java+超大文件上传
    php+文件夹上传
    php上传视频大文件
    每一个程序猿需掌握的20个代码命名小贴士
    Mysql整数运算NULL值处理注意点
    拓展欧几里得模板
    bzoj 1088 简单dfs
    决策树
    进程-IPC 管道 (一)
  • 原文地址:https://www.cnblogs.com/yangchangjie150330/p/10558312.html
Copyright © 2011-2022 走看看