dump与dumps

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内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。

我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!

点赞(81) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部