首页 > Python基础教程 >
-
python基础总结(4)
JavaScript Object Notation:Java脚本兑现标记语言。已经成为一种简单的数据交换格式。将数据转换成特殊字符串,不同语言都遵循的一种数据转化格式,用于储存dump()和load()或dumps()和loads()
或网络传输dumps()和loads()
。
json序列化:
import json
s = json.dumps([1,2,3,4,]) #将指定的对象转换成json格式的字符串,仍然放在内存中
print(s,type(s)) #[1, 2, 3, 4] <class 'str'>
#元祖序列化后变成列表
import json
s = json.dumps((1,2,3,4,))
print(s,type(s)) #[1, 2, 3, 4] <class 'str'>
#集合不可一被json序列化
#将结果直接写到文件中:json.dump(obj,fb)
with open('a.txt',mode='at',encoding='utf-8') as f:
json.dump(['1,2,3,'],f)
json反序列化:
import json
res = json.dumps([1,2,3,])
lst = json.loads(res)
#从文件中反序列化:json.loads(fb)
with open('a.txt',encoding='utf-8') as f:
res = json.load(f)
-
dump()和load()
只能一次性写,一次性读。把需要序列化的对象,通过dumps()和loads()
的方式,可实现多次读或写,写入时要换行,才能读出再转化。with open('a.txt',mode='wt',encoding='utf-8') as f: for i in range(10): f.write(json.dumps()+'\n') with open('a.txt',encoding='utf-8') as f: for i in f: json.loads(i.strip()) # 或json.loads(i),默认去除换行
pickle模块
可将python中所有的数据类型转换成字节串
元祖在pickle中转换不会改变类型。
pickle也可以转换set类型
pickle中dump()和load()
可以多次读写一个文件。dump(s,f)
可以写入python中的任何对象(变量、函数、类等)
import pickle
bys = pickle.dumps((1,2,3)) #转化为字节
res = pickle.loads(bys)
print(type(res),res) #<class 'tuple'> (1, 2, 3)
#把pickle序列化内容写入文件中:
with open('b.txt',mode='wb') as f:
pickle.dump([1,2,3],f)
#从文件中反序列化pickle数据:
with open('b.txt',mode='rb') as f:
pickle.load(f)
-
pickle与json的比较
json:
- 不是所有的数据类型都可以序列化
- 不能多次对同一个文件序列化
- json数据可以跨语言。
- json序列化只支持部分python数据结构:dict、tuple、int、float、True、False、None
pickle:
- 所有的python类型都能序列化,结果为字节串。
- 可以多次对同一个文件序列化
- 不能跨语言,只能在python中使用。
hashlib模块
封装一些用于加密的类。加密的目的:用于判断和验证,而非解密。给一个数据进行加密,用另个加密的结果和第一次加密的结果进行对比,如果加密结果想同,说明原文相同。
特点:
- 把一个大的数据切分成不同的块,分别对不同的块进行加密,再汇总的结果和直接对整体数据加密的结果是一致的。
- 单向加密,不可逆。
- 原始数据的一点小的变化,将导致加密结果非常大的差异。
md5加密算法:
import hashlib
#获取一个加密对象
m = hashlib.md5()
#使用加密对象的update进行加密
m.update(b'abc') #将abc变为字节,若有中文则为'abc'.encode('utf-8')
#通过hexdigest()获取加密。
res = m.hexdigest()
print(res) #900150983cd24fb0d6963f7d28e17f72
给一个数据加密的步骤:
-
获取一个加密对象,不只是有md5,还有sha系列
sha224', 'sha256', 'sha384', 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', 'sha512'
等,随着sha系列数字越高,加密越复杂,。在创建加密对象时,可以指定参数,使加密程度更高。import hashlib m = hashlib.md5('abc'.encode('utf-8')) m.update('qaz'.encode('utf-8')) print(m.hexdigest())
2. 使用加密对象的`update()`方法进行加密。加密对象可以调用多次(即为把一个大数据切分成小数据,再把小数据进行累次加密,不是对同一个数据多次加密)。都是对**字节**进加密。相同的加密对象将字节转化成**固定长度**的字符串。
3. 通常通过`hexdigest()`获取加密字符串,也可以通过`digest()`获取加密字节串。
不同加密算法的加密结果长度不同,随着加密结果的变长,加密时间也会变长。
```python
#注册和登录程序
import hashlib
def register():
username = input('输入用户名:')
passwd = input("输入密码:")
get_passwd = get_md5(passwd) #加密
with open('login',mode='at',encoding='utf-8') as f: #写入文件
f.write(f'{username}|{get_passwd}\n')
def login():
username = input('输入用户名:')
passwd = input('输入密码:')
get_passwd = get_md5(passwd)
res = f'{username}|{get_passwd}\n'
with open('login',mode='rt',encoding='utf-8') as f:
for line in f:
if res == line:
return True
else:return False
def get_md5(passwd):
m = hashlib.md5('12') #再次加密
m.update(passwd.encode('utf-8'))
return m.hexdigest()
while True:
op = input('1.注册 2.登录 3.退出')
if op == '1':
register()
elif op == '2':
res = login()
if res:
print('登录成功')
else:
print('登录失败,请重新登录')
elif op == '3':
break
else:print("您输入的有误,请重新输入")
文件的校验:
Linux中一切皆文件:文本文件,非文本文件,音频,视频,图片……。无论下载的视频还是国外的软件往往都会有一个md5值。
collections模块
封装了一些常用的容器类。
namedtuple()
:命名元祖,可以使用属性的方式引用元祖中的数据。
import collections as co:
#namedtuple()的返回值是一个类
Rectangle = co.namedtuple('Rectangle_class',['length','width']) #第一个参数是对类名的说明信息,不能有空格。namedtuple()的返回值是赋值给了自定的类名。
r = Rectangle(10,5)
#通过属性访问元祖的元素
print(r.length)
print(r.width)
#通过引所的方式访问元素
print(r[0])
defaultdict()
:默认值字典
#defaultdict():(自定义)函数(不能有参数)充当第一个参数
d = co.defaultdict(lambda :'hello',name='aa',age='10')
print(d['na']) #hello 若无要查询的键,不会报错,会根据函数返回一定的值,且会自动将此键值增加至字典中
print(d)
#defaultdict(<function <lambda> at 0x000001F90D30D378>, {'name': 'aa', 'age': '10', 'na': 'hello'})
Counter()
:计数器,返回值是字典,必须使用可哈希的数据。
c = co.Counter('asasasasaszszxaxzsxazsx')
print(c) #Counter({'s': 8, 'a': 7, 'z': 4, 'x': 4})
print(c.most_common(3)) #[('s', 8), ('a', 7), ('z', 4)]