Python的泡菜

Python中的泡菜在将Python对象表示为字节字符串的意义上非常好吃。 这些字节实际上可以完成很多事情。 例如,您可以将它们存储在文件或数据库中,或通过网络进行传输。

Python对象的腌制表示形式称为pickle文件 。 腌制的文件因此可以用于不同的目的,例如存储要由另一个Python程序使用的结果或编写备份。 要获得原始的Python对象,您只需解开该字节字符串即可。

为了在Python中进行腌制,我们将使用pickle模块。 如文档中所述:

pickle模块实现用于对Python对象结构进行序列化和反序列化的二进制协议。 “ Pickling”是将Python对象层次结构转换为字节流的过程,而“ unpickling”是逆运算,将字节流(来自二进制文件或类似字节的对象)转换回对象层次结构的过程。 酸洗(和酸洗)也被称为“序列化”,“编组”或“压平”。 但是,为避免混淆,此处使用的术语是“酸洗”和“未酸洗”。

pickle模块允许我们将几乎所有Python对象直接存储到文件或字符串中,而无需执行任何转换。 pickle模块实际执行的是所谓的对象序列化 ,即在字节串之间来回转换对象。 要腌制的对象将被序列化为字节流,该字节流可以写入例如文件中,并在以后还原。

安装pickle

pickle模块实际上已经与您的Python安装捆绑在一起。 为了获得已安装模块的列表,您可以在Python提示符下键入以下命令: help('modules')

因此,使用pickle模块要做的所有事情就是import pickle

创建一个泡菜文件

从本节开始,我们将看一些酸洗的例子,以更好地理解该概念。 让我们从一个对象创建一个pickle文件开始。 我们的目标是在Python的列表教程中创建todo列表。

todo = ['write blog post', 'reply to email', 'read in a book']

为了使列表对象( todo )腌制,我们可以执行以下操作:

import pickle

todo = ['write blog post', 'reply to email', 'read in a book']
pickle_file = file('todo.pickle', 'w')
pickle.dump(todo, pickle_file)

请注意,我们已经制作了一个import pickle ,可以使用pickle模块。 我们还创建了一个pickle文件来存储该todo.pickle对象,即todo.pickledump功能将todo的腌制表示形式写入打开文件对象pickle_file 。 换句话说,这里的dump函数有两个参数:要泡菜的对象,即todo列表;要在其中写入泡菜的文件对象,即todo.pickle

取消腌制(恢复)腌制的数据

假设我们想腌制(恢复)腌制的数据; 在我们的例子中,这是todo清单。 为此,我们可以编写以下脚本:

import pickle

pickle_file = file('todo.pickle')
todo = pickle.load(pickle_file)
print(todo)

上面的脚本将输出todo列表项:

['write blog post', 'reply to email', 'read in a book']

如文档中所述, load(file)函数执行以下操作:

从打开的文件目标文件中读取一个字符串,并将其解释为泡菜数据流,从而重建并返回原始对象层次结构。 这等效于Unpickler(file).load()

泡菜串

在上一节中,我们看到了如何在文件中写入/加载泡菜。 但是,这不是必需的。 我的意思是,如果我们要写/加载泡菜,我们并不一定需要处理文件,而是可以将泡菜作为字符串来使用。 因此,我们可以执行以下操作:

import pickle

todo = ['write blog post', 'reply to email', 'read in a book']
pickled_data = pickle.dumps(todo)
print(pickled_data)

请注意,我们已经使用了dumps (末尾带有“ s”)功能,根据文档所述:

以字符串形式返回对象的腌制表示形式,而不是将其写入文件中。

为了恢复上面的腌制数据,我们可以使用loads(string)函数,如下所示:

restored_data = pickle.loads(pickled_data)

根据文档, loads函数的作用是:

从字符串读取腌制的对象层次结构。 超出腌制对象表示形式的字符串中的字符将被忽略。

酸洗一个以上的物体

在以上示例中,我们仅处理了一次酸洗和还原(加载)对象。 在本节中,我将向您展示如何针对多个对象执行此操作。 假设我们有以下对象:

name = 'Abder'
website = 'https://abder.io'
english_french = {'paper':'papier', 'pen':'stylo', 'car':'voiture'} # dictionary
tup = (31,'abder',4.0) # tuple

如果您想了解有关Python字典和元组的更多信息,请查看以下教程:

我们可以通过运行一系列 dump函数来对上述对象进行腌制,如下所示:

import pickle

name = 'Abder'
website = 'http://abder.io'
english_french = {'paper':'papier', 'pen':'stylo', 'car':'voiture'} # dictionary
tup = (31,'abder',4.0) # tuple

pickled_file = open('pickled_file.pickle', 'w')
pickle.dump(name, pickled_file)
pickle.dump(website, pickled_file)
pickle.dump(english_french, pickled_file)
pickle.dump(tup, pickled_file)

这将使泡菜文件pickled_file.pickle中的所有四个对象泡菜。

还有一种使用pickle模块中的Pickler类编写上述脚本的奇妙方法,如下所示:

from pickle import Pickler

name = 'Abder'
website = 'http://abder.io'
english_french = {'paper':'papier', 'pen':'stylo', 'car':'voiture'} # dictionary
tup = (31,'abder',4.0) # tuple

pickled_file = open('pickled_file.pickle', 'w')
p = Pickler(pickled_file)
p.dump(name); p.dump(website); p.dump(english_french); p.dump(tup)

要恢复(加载)原始数据,我们可以简单地使用多个load函数,如下所示:

import pickle

pickled_file = open('pickled_file.pickle')

name = pickle.load(pickled_file)
website = pickle.load(pickled_file)
english_french = pickle.load(pickled_file)
tup = pickle.load(pickled_file)

print('Name: ')
print(name)
print('Website:')
print(website)
print('Englsh to French:')
print(english_french)
print('Tuple data:')
print(tup)

上面脚本的输出是:

Name: 
Abder
Website:
http://abder.io
Englsh to French:
{'car': 'voiture', 'pen': 'stylo', 'paper': 'papier'}
Tuple data:
(31, 'abder', 4.0)

Pickler类一样,我们可以使用pickle模块中的Unpickler类重写上述脚本,如下所示:

from pickle import Unpickler

pickled_file = open('pickled_file.pickle')
u = Unpickler(pickled_file)
name = u.load(); website = u.load(); english_french = u.load(); tup = u.load()

print('Name: ')
print(name)
print('Website:')
print(website)
print('English to French:')
print(english_french)
print('Tuple data:')
print(tup)

请注意,必须以相同的顺序写入和读取变量,以获得所需的输出。 为了避免出现任何问题,我们可以使用字典来管理数据,如下所示:

import pickle

name = 'Abder'
website = 'http://abder.io'
english_french = {'paper':'papier', 'pen':'stylo', 'car':'voiture'} # dictionary
tup = (31,'abder',4.0) # tuple

pickled_file = open('pickled_file.pickle', 'w')
data = {'name':name, 'website':website,'english_french_dictionary':english_french,'tuple':tup }
pickle.dump(data, pickled_file)

要恢复(加载)上述脚本中腌制的数据,我们可以执行以下操作:

import pickle

pickled_file = open('pickled_file.pickle')
data = pickle.load(pickled_file)

name = data['name']
website = data['website']
english_french = data['english_french_dictionary']
tup = data['tuple']

print('Name: ')
print(name)
print('Website:')
print(website)
print('English to French:')
print(english_french)
print('Tuple data:')
print(tup)

泡菜和熊猫

好吧,这似乎是一个有趣的组合。 如果您想知道熊猫是什么,可以从“ 熊猫入门”教程中了解有关它们的更多信息。 pandas的基本数据结构称为DataFrame ,这是一种由有DataFrame和行组成的表格数据结构。

让我们以Pandas教程中DataFrame为例:

import pandas as pd
 
name_age = {'Name' : ['Ali', 'Bill', 'David', 'Hany', 'Ibtisam'],
'Age' : [32, 55, 20, 43, 30]}
data_frame = pd.DataFrame(name_age)

为了使我们的DataFrame ,我们可以使用to_pickle()函数,如下所示:

data_frame.to_pickle('my_panda.pickle')

要恢复(加载)腌制的DataFrame ,我们可以使用read_pickle()函数,如下所示:

restore_data_frame = pd.read_pickle('my_panda.pickle')

将我们在本节中提到的内容放到一起,这就是腌制并加载pandas对象的脚本的样子:

import pandas as pd
 
name_age = {'Name' : ['Ali', 'Bill', 'David', 'Hany', 'Ibtisam'],
'Age' : [32, 55, 20, 43, 30]}
data_frame = pd.DataFrame(name_age)

data_frame.to_pickle('my_panda.pickle')

restore_data_frame = pd.read_pickle('my_panda.pickle')

print(restore_data_frame)

结论

在本教程中,我介绍了一个有趣的模块,称为pickle 。 我们已经看到了该模块使我们能够轻松地为不同目的存储Python对象的方法,例如将对象与另一个Python程序一起使用,在网络上传输对象,保存对象以供以后使用等。我们可以简单地对Python对象进行腌制,并在我们要还原原始对象时解开(加载)它。

不要犹豫,看看我们在市场上可以出售和学习的东西 ,也不要犹豫,使用下面的提要来问任何问题并提供宝贵的反馈。

翻译自: https://code.tutsplus.com/tutorials/pythons-pickles--cms-28839

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值