josn模块
Json 模块提供了四个方法: dumps、dump、loads、load
dumps:无文件操作 dump:序列化+写入文件
dumps只完成了序列化为str
dump必须传文件描述符,将序列化的str保存到文件中
1. json序列化方法:dumps和dump
(1)json.dumps()
将”obj“转换为JSON格式的字符串
dumps可以格式化所有的基本数据类型为字符串
>>> json.dumps([]) # dumps可以格式化所有的基本数据类型为字符串
'[]'
>>> json.dumps(1) #数字
'1'
>>> json.dumps('1') #字符串
'"1"'
>>> dict = {"name":"tom","age":23}
>>> json.dumps(dict) #字典
'{"age": 23, "name": "tom"}'
>>>
写入到文件中:
import json
a = {"name":"Tom","age":23}
with open("test.json","w",encoding="utf-8") as f:
f.write(json.dumps(a,indent=4)) #将a转化为json格式的字符串,然后写入到文件中: indent:以4个空格缩进,输出阅读友好型
查看test.json文件:
(2)
json.dump()
完成序列化为str ,并将str写入文件文件中。其中文件描述符是必须的。
import json
a = {"name":"Tom","age":23,"sex":1}
with open("test.json","w",encoding="utf-8") as f:
json.dump(a,f,indent=4) #f是必须的
2. json反序列化方法
loads:无文件操作 load: 读文件+反序列化
loads 只完成了饭序列化,
load 只接收文件描述符,完成了读取文件和反序列化
>>> import json
>>> json.loads('{"name":"TOM","age":18}')
{'name': 'TOM', 'age': 18}
>>>
注意一下例子:反序列化json格式的str之后,类型会有所不同,字典的字符串则为字典,数组的字符串则为数组
json.load()
的文件操作:
import json
with open("test.json","r",encoding='utf-8') as f:
aa = json.loads(f.read()) ##f.rand()先读出文件内容
f.seek(0)
bb = json.load(f) ##json.load() 直接对文件符操作
print(aa)
print(bb)
运行结果 :
{'age': 23, 'name': 'Tom', 'sex': 1}
{'age': 23, 'name': 'Tom', 'sex': 1}
hashlib 加密模块
以常见的MD5为列:
import hashlib
md5=hashlib.md5()
str = 'my name admin'
md5.update(str.encode('utf-8'))
print(md5.hexdigest())
运行的结果:
a4542e9bbf0be58b006ac63508fe36f5
如果数据量很大,可以分块多次调用update
最后计算的结果是一样的:
import hashlib
md5 = hashlib.md5()
md5.update('how to use md5 in '.encode('utf-8'))
md5.update('python hashlib?'.encode('utf-8'))
print(md5.hexdigest())
如果需要加上加密字符:
import hashlib
md5=hashlib.md5('passwor'.encode('utf-8')) #附加加密字符串
str = 'my name admin'
md5.update(str.encode('utf-8'))
print(md5.hexdigest())
StringIO模块 和BytesIO模块
(1)StringIO模块
在平时开发过程中,有些时候我们可能不需要写在文件中,我们可以直接通过StringIO模块直接写入到系统内存中,如果不用了,可以直接清除就可以了。StringIO主要是用来在内存中写入字符串的,及字符串的缓存。他的接口和文件的接口是一致的,基本所有关于文件的方法都可以常用,有几个特殊的:
s.getvalue()
此函数没有参数,无论读写位置在哪里,都能够返回对象s中所有的数据。
s.struncate(0)
参数0,表示清空所有写入的内容。
s.flush()
刷新内部缓冲区。
from io import StringIO
f = StringIO()
f.write("hello world")
print(f.getvalue())
f.write('hehehhe')
print(f.getvalue())
运行的结果:
hello world
hello worldhehehhe
要读取StringIO,可以用一个str初始化StringIO,然后,像读取文件一样读取:
from io import StringIO
f=StringIO('Hello!\nHi!\nGoodbye!')
while True:
s = f.readline() #读取文件的方法
if s =='':
break
print(s.strip())
运行结果:
Hello!
Hi!
Goodbye!
(2)BytesIO模块
StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO。
BytesIO实现了在内存中读写bytes:
from io import BytesIO
f=BytesIO()
f.write('中文'.encode('utf-8'))
print(f.getvalue())
运行结果:
b'\xe4\xb8\xad\xe6\x96\x87'