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模块一模一样。