day25模块 hashlib configparser logging

今日内容

json 补充

3.1 hashlib 加密,摘要算法

3.2 configparser 配置文件

3.3 logging  模块

json字符串和python 字符串到底差在什么地方?

json字符串在数据最外面始终是单引号引起来的.

json字符串如果数据是容器类的数据类型,且里面有字符串,字符串一定是双引号引起来的.

而python   "{'alex':'wusir'}"  不区分单双引号.

对于单独的字符串:

python显示:  "alex"    不区分单双引号

json显示:  ' "alex" '  外面还有一个单引号

 3.1 hashlib:hash:算法,结果是内存地址.

hashlib 模块与加密相关,实际上他是摘要算法.

1. hashlib 是一堆算法的合集,它包含很多算法(加密的).

2.hashlib 的过程就是将字符串转化成  一串由数字和字母组合的字符串的过程.(经过hashlib转化的结果是等长的)

3.hashlib对相同的字符串转化成的()数字加字母)是相同的

4. 不同的电脑对相同的字符串进行加密,转化成的数字相同.

hashlib 用在哪里?

1.密文(密码):将密码用算法加密放置到数据库.每次取出验证.

2. 文件的校验

初识 hashlib 

import  hashlib

#md5  加密算法, 常用算法,可以满足一般的常用需求.

#sha 1(有好几个等级) : 加密算法,级别高一些,数字越大级别越高,加密的效率越低,越安全.

#md5

s = "123456"

ret = hashlib.md5()  #创建一个md5对象

ret.update(s.encode("utf-8"))  #调用次update方法对参数进行加密bytes类型

print(ret.hexdigest())  #得到加密后的结果  定长

s2 = "dflajfldajkldjfljsejfl;jef;laeja;j;lajld"

ret = hashlib.md5()  #创建一个md5对象

ret.update(s2.encode("utf-8"))  #调用次update方法对参数进行加密bytes类型

print(ret.hexdigest())  #得到加密后的结果 定长

s3 = "dflajfldajkldjfljsejfl;jef;laeja;j;lajle"

ret = hashlib.md5()  #创建一个md5对象

ret.update(s3.encode("utf-8"))  #调用次update方法对参数进行加密 bytes类型

print(ret.hexdigest())  #得到加密后的结果  定长

s2 和s3就只有一个字母不一样,得到加密后的结果也是大不一样.

无论字符串多长,返回都是定长的(数字和字符串)

同一字符串,md5值相同.

黑客:将你常用的密码 000000    111111  等.对应的md5关系表给打印出来,因此就会有可能破解密码.

撞库:因为撞库,所以相对不安全,如何解决?

import hashlib

s = "123456"

ret = hashlib.md5()

ret.update(s.encode("utf-8")

print(ret.hexdigest())

解决方式:加盐

s1 = "123456"

ret = hashlib.md5("&&%%$".encode("utf-8"))  #创建一个md5对象,加盐

ret.update(s1.encode("utf-8"))  #调用此update方法对参数进行加密bytes类型

print(ret.hexdigest())  #得到加密后的结果 定长

如果黑客盗取到固定的盐,"&&%%$"内容,还是会破解密码

变成随机的盐:

import hashlib

username= "ajdklfja"

password = "123456"

ret = hashlip.md5(username[::-2].encode("utf-8"))

ret.update(password.encode("utf-8"))

print(ret.hexdigest())

sha 系列

hashlib.sha1()   #sha1与md5级别相同,但是sha1比md5更安全一些,因为sha1用得少.

import hashlib

ret = hashlib.sha1()

ret.update("122345".encode("utf-8"))

print(ret.hexdigest())

ret = hashlib.sha512()  #级别最高,效率低,安全性最大

ret.update("123456".encode("utf-8"))

print(ret.hexdigest())

文件的校验: 

def  func(file_name):

  with open(file_name,mode="rb")as f:  #用rb模式,文件里的内容就不需要再编译成bytes类型了.

    ret = hashlib.md5()

    ret.update(f.read())  #因为文件使用rb模式打开的所以这里不用编译成bytes类型

    return  ret.hexdigest()

print(func("hashlib_file"))

print(func("hashlib_file"))

上面的代码对于小文件可以(f.read()是一次性读取文件)但是超大的文件,内存就受不了.

import hashlib

s = "我爱你中国,我是地球人.也是亚洲人,更是中国人"

ret = hashlib.md5()

ret.update(s.encode("utf-8"))

print(ret.hexdigest())

get = hashlib.md5()

get.update(s[0:10].encode("utf-8"))

get.update(s[10:].encode("utf-8"))

print(get.hexdigest())

两次打印的结果是一样的

def  func(file_name):

  with open(file_name,mode="rb")as f:

    ret = hashlib.md5

    #for i in f:  #这个方法跟下面的方法得到的结果一样.

    #  ret.update(i)

    #return ret.hexdigest()

    while  True:

      content = f1.read(1024)

      if content:

        ret.update(content)

      else:

        break

    return  ret.hexdigest()

print(func("hashlib_file"))

print(func("hashlib_file"))

hashlib :用在密文(密码),或者文件的校验.

md5:普通的,   加盐的  ,  动态加盐的

sha系列: 普通的 , 加盐的, 动态加盐的

文件的校验:小文件,大文件.

3.2 configparser  (配置文件)(了解):放置一些常用的变量(以 .ini 结尾)

configparser 帮助操作(创建,增加,删,改,查)一个配置文件.

创建一个文件:

import  configparser

config = configparser.ConfigParser()

config['DEFAULT'] = {"ServerAliveInerval":"45",

          'Compression':"yes",

          'ComperssionLevel':"9",

          'ForwardXl1':'yes'

          }

config['bitbucket.org'] = {"user":"hg"}

config['topsecret.server.com'] = {'Host Port' : '45345','ForwardXl1' : 'no'}

with open("example.ini","w")as f:

  config.write(f)

以上操作便是创建一个example.ini的配置文件

import configparser

config = configparser.ConfigParser()

查找内容,基于字典的形式.

print(config.sections()) #打印出 []  空列表.

config.read("example.ini")#顺序:创建一个对象,然后将文件读到内存中,再进行相应的操作.

print(config.sections())#就会打印出文件的sections

#打印的结果为什么没有DEFAULT?因为他是特殊的,可以看做成一个全局的.

print("111"  in  config)  #False

print("bitbucket.org" in config)  #True

判断节名是否在配置文件中,上面的方法就是验证

对配置文件中的节对应的项取值

print(config["bitbucket.org"]["user"])#hg

print(config["DEFAULT"]['Compression"])#yes

print(config["topsecret.server.com"]["ForwardXl1"])#no

print(config["bitubcket.org"])#输出的是一个可迭代器

print(config["bitbucket.org"]["forwardxl1"])#yes

for key in config['bitbucket.org']#注意有default会默认default的键,意思就是default也能打印出来

  print(key)

print(config.options('bitbucket.org'))#同for循环,找到"bitbucket.org"下所有的键

print(config.items("bitbucket.org"))#找到"bitbucket.org"下所有的键值对,包括DEFAULT下的

print(config.get("bitbucket.org","compression"))#yes    get方法Section下的key对应的value

增删改

import configparser

config = configparser.ConfigParser()

config.read("new2.ini")

config.add_section("日天")

config.remove_section("bitbucket.org")

config.remove_option("topsecret.server.com'',"forwardxl1")

config.set("topsecret.server.com","k1","1111")

config.set("yuan","k2","22222")

config.write(open("new2.ini","w")

log  日志: 

什么时候用到日志?

生活中:

1.公司员工信息工号等等需要日志.

2.淘宝,京东 你的消费信息,浏览记录等等都记录日志中,个性化推荐.

3.头条个性化设置(爱好记录的日志中)

等等

工作上:

运维人员,任何员工对服务器做过的任何操作,都会记录到日志中.如果你要是从事运维开发的工作,各处都需要日志.

debug模式,需要依靠日志的,

定时收集信息,也要记录日志.

logging 模块是辅助你记录日志的,不是自动记录日志的.

低配版,logging

高配版,logger  对象

低配版,logging

import logging

等级是一层一层升高的.

logging.basicConfig(level=logging.DEBUG)

level = logging.DEBUG设置显示报错的级别

logging.debug("debug message") #调试信息

logging.info("info message")#正常信息

logging.warning("warning message")#警告信息:代码虽然不报错,但是警告写的不规范,必须改

logging.error("error message")#错误信息

logging.critical("critical  message")#严重错误信息

用法实例:

try:

  num = input("<<<<")

  num = int(num)

except ValueError:

  logging.error("出现了%s"%ValueError)

1.调整格式.(完善报错信息)

logging.basicConfig(level = logging.DEBUG,

          format = "%(asctime)s %(filename)s (line:%(lineno)d) %(levelname)s %(message)s",

)

logging.debug("debug message")

logging.info("info  message")

logging.warning("warning  message")

logging.error("error message")

logging.critical("critical  message")

logging.basicConfig(level= logging.DEBUG,

          format = "%(astime)s %(filename)s (line:%(lineno)d) %(levelname)s %(message)s",

          datefmt = "%a, %d %b %Y %H:%M:%S:,    #设置时间格式

          filename = "low_logging.log", #设置文件名

          filemode = "w"  #设置写入模式

            )

logging.warning("warning message")

logging.error("error message")

logging.critical("critical message")

try:

  num = input("<<<<")

  num = int(num)

except Exception as e:

  logging.warning(e)

  logging.error(e)

  logging.critical(e)

低配版 logging 缺点:

1.写入文件打印日志不能同时进行

2.写入文件时文件编码方式为gbk

猜你喜欢

转载自www.cnblogs.com/fengkun125/p/9278279.html