python 学习笔记12 (json、hashlib、Stri

2018-04-27  本文已影响0人  我是帅气的石头

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文件:

image.png
(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之后,类型会有所不同,字典的字符串则为字典,数组的字符串则为数组


image.png
image.png

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'
上一篇下一篇

猜你喜欢

热点阅读