dump和dumps是Python中的两个常用函数,分别用于将Python对象序列化为字符串和将Python对象序列化为二进制字节串。两者的用法和含义有所不同,下面将分别进行介绍。
# 1. dump函数
dump函数属于Python中内置的模块pickle,用于将Python对象序列化为字符串(即将一个Python对象转换为一组字节流)。其基本用法为:
```python
import pickle
def dump(obj, file, protocol=None, *, fix_imports=True):
"""
Serialize obj as a pickle data stream to the open file object file.
"""
pass
```
其中,obj为需要序列化的Python对象,file为打开的文件对象,protocol表示序列化使用的协议版本,fix_imports表示是否自动修正对象导入。
下面是一个dump函数的示例:
```python
import pickle
f = open('test.pkl', 'wb')
data = {'a': 1, 'b': 2, 'c': 3}
pickle.dump(data, f)
f.close()
f = open('test.pkl', 'rb')
new_data = pickle.load(f)
print(new_data) # {'a': 1, 'b': 2, 'c': 3}
f.close()
```
上述代码中,我们首先定义了一个字典数据`data`,将其序列化为二进制文件`test.pkl`中,然后再从该文件中读取数据,反序列化为Python对象`new_data`。最终输出结果为字典`{'a': 1, 'b': 2, 'c': 3}`。
# 2. dumps函数
与dump函数不同,dumps函数的作用是将Python对象序列化为二进制字节串(即将一个Python对象转换为一组二进制字节流)。其基本用法为:
```python
import pickle
def dumps(obj, protocol=None, *, fix_imports=True):
"""
Return the pickled representation of the object as a bytes object,
instead of writing it to a file.
"""
pass
```
其中,obj为需要序列化的Python对象,protocol表示序列化使用的协议版本,fix_imports表示是否自动修正对象导入。
下面是一个dumps函数的示例:
```python
import pickle
data = {'a': 1, 'b': 2, 'c': 3}
serialized_data = pickle.dumps(data)
new_data = pickle.loads(serialized_data)
print(new_data) # {'a': 1, 'b': 2, 'c': 3}
```
上述代码中,我们首先定义了一个字典数据`data`,将其序列化为二进制字节串`serialized_data`,然后再从该字节串中读取数据,反序列化为Python对象`new_data`。最终输出结果为字典`{'a': 1, 'b': 2, 'c': 3}`。
# 3. 序列化协议
从上面的代码中可以看出,dump和dumps函数在序列化时都可以指定协议(即protocol参数),如果不指定则默认为3,表示使用最高协议版本。序列化协议共有5个版本,不同的协议版本对应着不同的序列化效果和文件大小,一般来说,协议版本越高,序列化效果越好,文件大小也越大。
Python的序列化协议有如下五种:
- 协议版本0:ASCII协议,用于ASCII码数据的序列化;
- 协议版本1:老式二进制协议,不兼容Python 3之后的版本;
- 协议版本2:比较古老的二进制协议,能够兼容Python 2.x和Python 3.x;
- 协议版本3:Python 3.x使用的默认协议,二进制存储,更高效地处理整数、长整数和浮点数等;
- 协议版本4:Python 3.4增加的协议,比协议版本3在处理二进制数据方面更加高效。
# 4. 序列化与反序列化示例
下面是一个使用dump和dumps函数进行序列化和反序列化的完整示例:
```python
import pickle
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"Person(name='{self.name}', age={self.age})"
person = Person('张三', 25)
data = pickle.dumps(person)
new_person = pickle.loads(data)
print(new_person) # Person(name='张三', age=25)
file = open('person.pkl', 'wb')
pickle.dump(person, file)
file.close()
file = open('person.pkl', 'rb')
new_person = pickle.load(file)
file.close()
print(new_person) # Person(name='张三', age=25)
```
上述代码中,我们定义了一个`Person`类,该类有两个属性`name`和`age`,分别代表姓名和年龄。我们将一个`Person`对象序列化为二进制字节串`data`,之后再将其反序列化为新的`Person`对象`new_person`,最后输出`new_person`的结果为`Person(name='张三', age=25)`。
另外,我们也演示了如何将序列化数据写入文件中。我们将`person`对象使用`dump`函数序列化,并写入到文件`person.pkl`中。之后我们再从该文件中读取数据,反序列化为新的`Person`对象`new_person`,最终输出其结果也为`Person(name='张三', age=25)`。
壹涵网络我们是一家专注于网站建设、企业营销、网站关键词排名、AI内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。
我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!
发表评论 取消回复