序列化模块

import json
# json 序列化模块 是所有语言通用的一种标准(数据转化格式)。
# str int bool dict list(tuple) None import pickle
# pickle 序列化模块 只是支持python语言之间的互相传输。
# python语言的所有数据类型 对象 都可以进行网络传递
# 写入文件时 可以写入多个。 import shelve # 了解
# shelve 序列化模块 只是支持python语言,与文件相关。
# 第一对方法:dumps loads  与网络传输相关
dic = {'name': "太白金星", 'hobby_list': ['戒烟', '烫不了头', '戒酒']}
print(dic)
s = json.dumps(dic,ensure_ascii=False) # 序列化过程
print(s,type(s))
dic1 = json.loads(s) # 反序列化过程
print(dic1, type(dic1))

dumps loads

# 第二对 dump load 与文件相关
dic = {'name': "太白金星", 'hobby_list': ['戒烟', '烫不了头', '戒酒']}
with open('序列化.json', encoding='utf-8', mode='w') as f1:
json.dump(dic, f1, ensure_ascii=False) with open('序列化.json', encoding='utf-8',) as f2:
ret = json.load(f2)
print(ret, type(ret))

dump load

# 参数讲解:
dic = {'name': "太白金星",
'hobby_list': ['戒烟', '烫不了头', '戒酒'],
'age': 18,
'money': '1个亿'}
print(dic)
s = json.dumps(dic,ensure_ascii=False,sort_keys=True,separators=('|',',')) # 序列化过程
# sort_keys 按键排序
# ensure_ascii=False 显示中文
# separators=('|',',') 设置分隔符 没有意义

参数讲解

json 和 bytes的区别

bytes 只能操作str,用于网路传输

json 可操作 str , int,bool,dict,list,(tuple),None用于网路传输,文件存储

用json将多个字典写入一个文件

# 如果用dump load 一个文件只能写入一个数据结构
dic1 = {'name': '春哥'}
dic2 = {'name': '子伍'}
dic3 = {'name': '王子'}
with open('多个字典.json',encoding='utf-8',mode='w') as f1:
f1.write(json.dumps(dic1, ensure_ascii=False) + '\n')
f1.write(json.dumps(dic2, ensure_ascii=False) + '\n')
f1.write(json.dumps(dic3, ensure_ascii=False)) with open('多个字典.json',encoding='utf-8',mode='r') as f1:
for line in f1:
print(json.loads(line))
ret1 = json.loads(f1.read())
ret2 = json.loads(f1.read())
ret3 = json.loads(f1.read())
print(ret1, ret2, ret3)

总结:  

  dumps  loads用于网络传输和多个数据写入文件

  dump  load 只能用于一个数据结构写入文件

注意:

# 坑:
dic = {1: 'alex'} # 如果键是数字,自动转字符串
ret = json.dumps(dic)
print(ret)
print(json.loads(ret))

import  pickle

dumps loads 用于网络传输 :将数据结构 ----> 转化成bytes

dic = {'name': "太白金星",
'hobby_list': ['戒烟', '烫不了头', '戒酒'],
'age': 18,
'money': '1个亿'}
s1 = pickle.dumps(dic)
print(s1) # 是bytes字符显示,不能显示任何其他类型
dic2 = pickle.loads(s1)
print(dic2)
dic = {'name': "太白金星",
'hobby_list': ['戒烟', '烫不了头', '戒酒'],
'age': 18,
'money': '1个亿'}
with open('p1.pickle',mode='wb') as f1: # wb: bytes形式
pickle.dump(dic, f1) # 操作文件用dump
with open('p1.pickle',mode='rb') as f1:
dic1 = pickle.load(f1) # 注意要用load
print(dic1)

dump, load

利用dump,load写多个字典到文件
# 利用dump load 将多个数据写入文件
dic1 = {'name': '春哥'}
dic2 = {'name': '子伍'}
dic3 = {'name': '王子'}
with open('p2.pickle',mode='wb') as f1:
pickle.dump(dic1, f1)
pickle.dump(dic2, f1)
pickle.dump(dic3, f1)
with open('p2.pickle', mode='rb') as f2:
print(pickle.load(f2))
print(pickle.load(f2))
print(pickle.load(f2))

dump写多个文件

def func():
print(666) with open('p3.pickle',mode='wb') as f1:
pickle.dump(func,f1) #函数名写入文件 with open('p3.pickle',mode='rb') as f1:
ret = pickle.load(f1)
ret() # ret() == func()

json 和 pickle
这里我们要说明一下,json是一种所有的语言都可以识别的数据结构。
如果我们将一个字典或者序列化成了一个json存在文件里,那么java代码或者js代码也可以拿来用。
但是如果我们用pickle进行序列化,其他语言就不能读懂这是什么了~
所以,如果你序列化的内容是列表或者字典,我们非常推荐你使用json模块
但如果出于某种原因你不得不序列化其他的数据类型,而未来你还会用python对这个数据进行反序列化的话,那么就可以使用pickle

import  shelve  # 了解

# shelve序列化模块,只是支持python语言,与文件相关

import shelve
f = shelve.open('shelve_file')
f['key'] = {'int':10, 'float':9.5, 'string':'Sample data'} #直接对文件句柄操作,就可以存入数据
f.close()
# 给文件写入一个字典:{'key':{'int':10, 'float':9.5, 'string':'Sample data'}} f = shelve.open('shelve_file')
print(f['key'])
f.close() import shelve
f1 = shelve.open('shelve_file',writeback=True)
print(f1['key'])
f1['key']['new_value'] = 'this was not here before'
f1.close() f1 = shelve.open('shelve_file')
print(f1['key'])
f1.close()
# writeback=True 如果相对shelve文件进行修改,必须要添加这个参数

import  hashlib

给密码加密

文件的校验

hashlib:将str类型,通过算法 -----> 一串等长度的数字

1、不同的字符串,转化成数字肯定不同

2、相同的字符串即使在不同的计算机上只要使用相同的加密方式,转化的数字一定相同

3、hashlib加密不可逆,不能破解

MD5

普通版,容易破解

import hashlib
ret = hashlib.md5()
ret.update(''.encode('utf-8'))
print(ret.hexdigest()) # 202cb962ac59075b964b07152d234b70

静态加盐版:

import hashlib
ret = hashlib.md5('verygood'.encode('utf-8')) #
# 加盐,给每一个密码添加verygood后,在计算md5码
ret.update(''.encode('utf-8'))
print(ret.hexdigest())

动态加盐:

import hashlib
username = input('用户名: ')
ret = hashlib.md5(username[::2].encode('utf-8')) #
# 动态加盐,给每一个密码添加切片后的用户名,在计算md5码
ret.update(''.encode('utf-8'))
print(ret.hexdigest())
md5 加密效率快,通用,安全性相对差
sha系列,算法更好 安全性高,效率低,耗时长
import hashlib
# ret = hashlib.sha1()
# ret.update('gjfds;gfjdgfkdg;lfdkg;fdlgk;fldgk;fldg'.encode('utf-8'))
# print(ret.hexdigest())
#
#
# ret = hashlib.sha512()
# ret.update('gjfds;gfjdgfkdg;lfdkg;fdlgk;fldgk;fldg'.encode('utf-8'))
# print(ret.hexdigest())

sha加密

文件的校验

小文件校验

import hashlib
def check_md5(file):
ret = hashlib.md5()
with open(file, mode='rb') as f1:
ret.update(f1.read()) # 读全文
return ret.hexdigest()
print(check_md5('文件校验1'))
print(check_md5('文件校验2'))

小文件校验

大文件校验

import hashlib
def check_md5(file):
ret = hashlib.md5()
with open(file, mode='rb') as f1:
while 1:
count = f1.read(1024) # 每次读1204个字节
if count: # 文件最后一次读为空,count为False 走else
ret.update(count)
else:
break
return ret.hexdigest()
print(check_md5('文件校验1'))
print(check_md5('文件校验2'))

os模块:

os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径  ***
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: ('.')
os.pardir 获取当前目录的父目录字符串名:('..') #和文件夹相关
os.makedirs('dirname1/dirname2') 可生成多层递归目录 ***
os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname **
os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 ** # 和文件相关
os.remove() 删除一个文件 ***
os.rename("oldname","newname") 重命名文件/目录 ***
os.stat('path/filename') 获取文件/目录信息 # 和操作系统差异相关
os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix' # 和执行系统命令相关
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的大小

SYS模块

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

异常处理

collections模块

1.namedtuple: 生成可以使用名字来访问元素内容的tuple

2.deque: 双端队列,可以快速的从另外一侧追加和推出对象

from collections import deque
q = deque(['a','b','c'])
print(q)
# 从右边增加值
q.append('x')
q.append('y')
# 从右边删除值
q.pop()
q.pop()
# 从左边增值
q.appendleft('x')
q.appendleft('y')
# 从左边删除
q.popleft()
q.popleft()
print(q)

3.Counter: 计数器,主要用来计数

from collections import Counter
# s1 = '电脑电脑sldfjslffdsaf'
s1 = ['电脑','电脑','电脑','电脑','书']
c = Counter(s1)
print(c)
print(dict(c)) # {'电脑': 4, '书': 1}

4.OrderedDict: 有序字典

5.defaultdict: 带有默认值的字典

day15 json,os,sys,hashlib的更多相关文章

  1. Python进阶(九)----json模块, pickle模块, os模块,sys模块,hashlib模块

    Python进阶----json模块, pickle模块, os模块,sys模块,hashlib模块 一丶序列化模块 什么是序列化: ​ 将一种数据结构,转换成一个特殊的序列(特殊字符串,用于网络传输 ...

  2. Py修行路 python基础 (二十)模块 time模块,random模块,hashlib模块,OS及sys模块

    一.前提介绍: 可以开辟作用域的只有类,函数,和模块            for循环 if,else: 不能开辟自己的作用域 避免程序复用和重复调用,将这些写到一个.py文件中,做成一个模块,进行调 ...

  3. Python 第五篇(上):算法、自定义模块、系统标准模块(time 、datetime 、random 、OS 、sys 、hashlib 、json和pickle)

    一:算法回顾: 冒泡算法,也叫冒泡排序,其特点如下: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应 ...

  4. python,os操作文件,文件路径(上一级目录)

    python获取文件上一级目录:取文件所在目录的上一级目录 os.path.abspath(os.path.join(os.path.dirname('settings.py'),os.path.pa ...

  5. day13 函数模块之序列化 random 模块 os模块 sys模块 hashlib模块 collections模块

    json import json dic = {'k1':'v1','k2':'v2','k3':'v3'} str_dic = json.dumps(dic) #序列化:将一个字典转换成一个字符串 ...

  6. day17——序列化、os、sys、hashlib、collections

    day17 序列化 json 两组4个方法: 1.dumps(序列化) -- loads(反序列) dumps(list):将对象转换成字符串 loads(str):将字符串转换成对象 list--s ...

  7. python常用模块json、os、sys

    一.序列化 json & pickle 模块 json--用于字符串和Python数据类型间进行转换 pickle---用于python特有的类型和Python的数据类型间进行转换 json: ...

  8. Python3 os模块&sys模块&hashlib模块

    ''' os模块 非常重要的模块 ''' import os # print(os.getcwd()) # 获取当前工作目录 # os.chdir(r'路径名') # 改变当前工作目录 # print ...

  9. time模块 datetime 模块 random 模块 OS 模块 sys 模块 hashlib 模块

    time模块 在python中的时间表现形式: 时间戳 (自1970-01-01-00-00 到当前时间,按秒计算,一共过了多少秒 格式化时间 返回的是时间的字符串 格式化时间对象 返回的是一个元组  ...

  10. Day5- Python基础5 模块导入、time、datetime、random、os、sys、hashlib、json&pickle

    本节目录: 1.模块的分类 2.模块的导入 3.time模块 4.datetime模块 5.random 6.os模块 7.sys模块 8.hashlib 9.json&pickle 一.模块 ...

随机推荐

  1. Mysql 死锁分析学习

    https://blog.csdn.net/aesop_wubo/article/details/8286215   * CREATE TABLE `user_item` ( * `id` BIGIN ...

  2. linux查询硬件信息

    硬件信息查询 sudo dmidecode -t baseboard

  3. 关于linux 内存碎片指数

    linux针对每一个node的每个zone的每个order,都有一个碎片指数来描述当前的碎片程度,也就是 extfrag_index 参数: extfrag_index这个要展示出来,需要内核编译了两 ...

  4. webpack 自动发现 entry 的配置和引用方式

    假定我们的项目目录为如下的样子: - root/ - assets/ - app/ - global.js - index/ - index.js - auth/ - login.js - regis ...

  5. 遍历DOM树,链式操作

    如果需要在同一个选取结果上使用多个jQuery方法,可以同时列出这些方法,并用.隔开,如下面的代码. 1 $("#one").hide().delay(500).fadeIn(15 ...

  6. c语言基本数据类型及存储方式

    ; ; ; ; ; ; ; ; float a9 = 109.23; float a10 = 111.23; double a11 = 113.113; double a12 = 115.113; c ...

  7. 一个困扰了我N久的bug , android.enableAapt2=false 无效

    Error:java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT error: c ...

  8. C# 图像处理:获取鼠标位置信息(全局)

    Point ms = Control.MousePosition; //获取鼠标位置 this.label2.Text = string.Format("{0}:{1}", ms. ...

  9. C# 中文判断

    原地址忘了,也是博客园的 /// <summary> /// 是否是 中文 /// </summary> /// <param name="CString&qu ...

  10. LinQ to sql 各种数据库查询方法

    1.多条件查询: 并且 && 或者 || var list = con.car.Where(r => r.code == "c014" || r.oil == ...