IO,pickle和JSON 2020-11-25

stringIO和bytesIO

python中的IO模块提供了对str操作的StringIO函数,要把str写入StringIO,我们需要创建一个StringIO对象,然后像写文件一样可以写入即可。
例子1:

from io import
h = StringIO()
h.write("hello")
h.write("   ")
h.write("world!")
print(f.getvalue())


输出为:hello  world!

这个例子创建了StringIO对象,然后调用了write方法写入数据,和文件操作几乎相同。getvalue方法用于获取写入后的str。
要获取StringIO,可以先用一个str初始化StringIO,然后像读取文件一样读取。
例子2:

from io import StringIO
f = StringIO("Hello!\nWorld!\nWelcome!")
while True:
	s = f.readline()
	if s == '':
		break
	print(s.strip())

输出结果:
Hello!
World!
Welcome!
  • StringIO的操作对象只能是str,如果要操作二进制数据,就需要使用BytesIO.
    BYtesIO实现了内存中读写bytes,我们可以先创建一个BytesIO,然后写入一些bytes。
    例如:
from io import BytesIO
f = BytesIO()
f.write("您好".encode("utf-8"))
print(f.getvalue())
print(f.getvalue().decode("utf-8"))


输出为:
b'\xe6\x82\xa8\xe5\xa5\xbd'
您好

注意:写入的不是str而是经过utf-8编码过的bytes。
和StringIO类似,可以先用一个bytes初始化BytesIO,然后像读文件一样读取。例如:

from io import BytesIO
f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
print(f.read().decode("utf-8"))


执行结果如下:
中文

序列化与反序列化

序列化:把变量从内存中变成可存储或传输的过程(将数据结构或者对象转换成二进制串的过程)
pickle模块:实现了一些基本数据的序列化和反序列化。通过pickle模块的序列化操作,我们可以将程序中运行的对象信息保存到文件中,永久存储;通过pickle模块的反序列化操作,我们可以从文件中恢复或者创建上次程序保存下来的对象。
pickle模块中的dumps方法可以把对象序列化成bytes,例如:

import pickle

class Student:
	def __int__(self,name,age,gender)
		self.name = name
		self.age = age
		self.gender = gender
student1 = Student("小明",15,"男")
print(pickle.dumps(student1))


输出的信息为student1中的内容转化成二进制的形式。
import pickle

class Student:
	def __init__(self,name,age,gender):
		self.name = name
		self.age = age
		self.gender = gender
student1 = Student("小红",15,"女")

with open("student1.data","wb") as f:
	pickle.dumps(student1,f)	

执行以上例子会生成文件student1.data,这个文件包含了代码中student1对象的信息。用文本编译器打开student1.data文件会看到一堆看不懂的内容(二进制字符),这些都是pickle保存的对象的信息。
既然已经将序列化的内容保存到文件中了,在使用文件时自然也可以把对象从磁盘读取到内存中。我们可以先把内容读取到一个bytes对象中,然后使用pickle.loads方法反序列化后的对象。
pickle.loads()反序列化操作

import pickle
class Student:
	def __init__(self,name,age,gender):
		self.name = name
		self.age = age
		self.gender = gender
f = open("student1.data","rb")
data = f.read()
student1 = pickle.loads(data)
f.close()
print("姓名",student1.name)
print("年龄",student1.age)
print("性别",student1.gender)

输出为:
姓名小红
年龄 15
性别 女

从这个例子中可以看到文件中的student1对象被正确地读取出来并加载到变量中(注意:类定义不能省略)。
序列化的时候可以直接写入文件对像,读取的时候当然可以直接从文件对象中读取,例如:

import pickle
class Student:
	def __init__(self,name,age,gender):
		self.name = name
		self.age = age
		self.gender = gender
with open("student1.data","rb") as f :
	student1 = pickle.loads()
	print("姓名",student1.name)
	print("年龄",student1.age)
	print("性别",student1.gender)


输出结果:
姓名小红
年龄 15
性别 女

这个执行结果和我们手动读取bytes然后使用loads方法反序列化的效果是一样的。
注意:pickle的序列化和反序列化操作只能用于python而不能被其他语言读取,并且不同版本的python之间也可能存在兼容性问题,所以使用pickle做序列化和反序列化操作的时候要注意这一点

JSON序列化和反序列化

由于pickle只支持Python,并不支持其他语言,幸好Python还内置了JSON模块,也可以用于序列化和 反序列化。
JSON(javaScript Object Notation,Javascript对象表示法)是一种轻量级的数据交换格式,易于阅读和编写,也易于机器的解析和生成。
|JSON类型 |python类型 |
|object | dict|
|array | list|
|string | str|
|number(int) | int|
||number(real) | float|
|true | True|
|false | Flase|
|null | None|

JSON和pickle模块一模一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值