zoukankan      html  css  js  c++  java
  • picklejson,configparser,hashlib模块

    python常用模块

    json模块pickle模块

    首先说一下序列化和反序列化 。

    1. 序列化:将数据内容转化成一种特定的格式。
    2. 反序列化:将特定的格式在转化成数据内容。

    其实我们之前学过序列化和反序列化的方法,即将内存中的数据转化为字符串的格式存进文件中,在从文件中利用eval()的方法反序列化出来。这也是一种方法,但是现在有更方便的方法。

    json模块是个序列化模块,市面上语言的种类有很多,每中语言又有自己独特的结构,当不同语言之间进行数据的交流,就可以采用json模块了,它是将变量内容转化成一种特殊格式,表现出来就是一种字符串,能够被所有的语言使用,在跨平台交流中起着重要的作用。

    另外就是如果我们在玩游戏中,要保存自己当前的状态,方便我们下次接着玩的时候,也可以使用序列化将我们的信息暂时存放起来,下次登录的时候再反序列化成当前内容。

    根据使用的目的不同,我们可以使用不同的模块,如果我们只是为了存储当前状态的话,那么推荐使用pickle模块,但是如果要是进行跨平台的数据传输的话,那就需要使用json模块了。

    如何使用序列化和反序列化呢?

    import json
    
    # json序列化
    a_json = json.dumps("{1,2,3,4,5}")
    
    # json反序列化
    json.loads(a_json)
    

    dumps和loads是相对应的,上述内容只是在内存中进行转化,如果是想要存储的话 ,那么就需要用到下面这种方法 了。

    import json
    
    a = {1,2,3,4,5}
    # json序列化到文件
    with open("a.txt","w",encoding="utf-8") as f:
    	f.dump(a,f)
    	
    # json反序列化文件
    with open("a.txt","r",encoding="utf-8") as f:
    	f.loads(f)
    

    json不需要懂得每种语言独特的结构,它只负责将内容处理成大家都认识的格式,完美的实现了不同语言环境下的数据共享。

    pickle则是python自己独有的序列化模块,他的使用方法和json一毛一样,可以参考json的使用方法,一般如果不涉及到跨平台,跨语种的交流数据,推荐使用pickle模块。

    小知识:

    如果我们在大量的使用了一个模块A之后,突然发现了一个比这个模块更好用的一个模块A+中的功能,不但能实现A中的功能,还更加完美高效。此时我们应该怎么办呢?

    当然是选择使用新的,那么问题来了,如果我们使用新功能,那么之前我们使用的总不能挨个去更改吧,这个时候就要用到一种编程思维:猴子补丁。在软件目录规范中,我们都是通过start的文件开始启动整个程序的,如果我们直接在入口处更改这个功能,就可以一劳永逸的解决这个新的问题。

    # 使用ujson来替换json中的dump和load。
    import json
    import ujson
    def monkey_patch():
    	json.dumps = ujson.dumps
    	json.loads = ujson.loads
    monkey_patch()
    

    configparser模块

    这个模块的额主要作用就是读取.ini结尾的文件中的特定格式的内容。在文档内容中主要是以sections:options格式来存放的。

    # a.ini中的内容
    [section1]  # 这个相当于分割线,是一个名为section1变量的内容
    name="tom"
    age=18
    
    [section2]
    name="jerry"
    age=12
    

    具体类似于section1 = {"name":"tom","age"=18}.但是前者是section后者是option。

    import configparser
    
    config = congigparser.ConfigParser()
    config.read("a.ini")
    
    # 获取sections
    print(config.sections())
    
    # 获取options
    print(config.options())
    
    # 取出tom
    name = config.get("section1","name")
    

    hashlib模块

    hash 是一种算法,该算法将传入内部的值经过一系列复杂的算法得到一段固定长度的值.

    1. 只要传入内容相同,那么得到的hash值也一样。
    2. hash值得长度是固定的。
    3. 不能由值反推出输入的内容。

    前两个特性主要用于验证文件的完整性,而第三个则完美的表现了其应用于密码的设定的特性。毕竟我们谁也不想让自己的密码被人家轻易识破。

    # hashlib模块的使用。
    import hashlib
    
    m = hashlib.md5() # 得到一个工厂。
    m.update("123".encode("utf-8"))
    m.update("456".encode("utf-8"))
    hasd_value = m.hexdigest()  # 123456的hash值
    

    ”撞库“是一种用来推测密码的方式,通过明文的用户名去推测有可能使用的一些密码,然后用撞大运的方式挨个将这些值通过同样的算法得到hash值然后去测试是否可以通过验证。

    为了抵抗这种行为可以用户密码输入的时候,通过'"加盐"'的操作去增加破解难度。即在用户的密码中添加一些额外的东西,然后得到hash值,在数据库中存放的就是这样的hash值。

    subprocess模块

    这个模块可以根据用户运行命令结果的不同,返回不同的输入。

    import subprocess
    
    obj = subprocess.Popen("echo 123;ls/;ls/root",shell=True,
    						stdout=subprocess.PIPE,
    						stdeer=subprocess.PIPE,)
    
    # 命令执行成功
    msg = obj.stdout.read().decode("GBK")
    
    # 命令执行失败
    msg = obj.stdeer.read().decode("GBK")
    

    解码指定的字符编码是系统本身的字符编码。

  • 相关阅读:
    Go语言基础之切片
    Go语言基础之map
    Go语言基础之函数
    Go语言基础之指针
    Go语言基础之结构体
    Redis缓存失效策略
    redis 的过期策略都有哪些?内存淘汰机制都有哪些?
    关于redis的主从、哨兵、集群
    Redis的 RDB和 AOF持久化的区别
    为什么做分布式使用 Redis
  • 原文地址:https://www.cnblogs.com/liqianxin/p/12606971.html
Copyright © 2011-2022 走看看