Python:将版本号和数据保存到pickle文件中
我正在将一些数据序列化到pickle文件中。不幸的是,数据的结构可能会改变。因此,我在代码中有一个静态版本号,如果数据结构发生更改,该版本号将递增。在这种情况下,pickle文件中的数据无效,应该丢弃 所以我试图保存一个由数据和版本号组成的元组。但是从pickle中恢复它会引发一个UnicodeDecodeError: UnicodeDecodeError:“ascii”编解码器无法解码位置0:序号不在范围(128)中的字节0x80 我想知道你会如何包括一个版本号?将其嵌入文件路径是一种选择,但要复杂得多。这是我的密码:Python:将版本号和数据保存到pickle文件中,python,serialization,deserialization,pickle,Python,Serialization,Deserialization,Pickle,我正在将一些数据序列化到pickle文件中。不幸的是,数据的结构可能会改变。因此,我在代码中有一个静态版本号,如果数据结构发生更改,该版本号将递增。在这种情况下,pickle文件中的数据无效,应该丢弃 所以我试图保存一个由数据和版本号组成的元组。但是从pickle中恢复它会引发一个UnicodeDecodeError: UnicodeDecodeError:“ascii”编解码器无法解码位置0:序号不在范围(128)中的字节0x80 我想知道你会如何包括一个版本号?将其嵌入文件路径是一种选择,但
#%% Create a dataframe
import pandas as pd
values = {'Latitude': {0: 47.021503365600005,
1: 47.021503365600005,
2: 47.021503365600005,
3: 47.021503365600005,
4: 47.021503365600005,
5: 47.021503365600005},
'Longitude': {0: 15.481974060399999,
1: 15.481974060399999,
2: 15.481974060399999,
3: 15.481974060399999,
4: 15.481974060399999,
5: 15.481974060399999}}
df = pd.DataFrame(values)
df.head()
#%% Save the dataframe including a version number
import pickle
VERSION = 1
file_path = 'tmp.p'
with open(file_path, 'wb') as f:
pickle.dump((df, VERSION), f)
#%% Load the dataframe including the original verison number
try:
with open(file_path, 'r') as f:
df, version = pickle.load(f)
except ValueError as ex:
print (ex)
version = -1
#%% Compare version numbers
if version != VERSION:
print ('Version do not match')
如果确实希望使用pickle存储对象,可以在csv文件中存储元组,如下所示:
with open('my_file.csv', 'w') as fd:
writer = csv.writer(fd)
writer.writerow([version_number, pickle.dumps(fd)])
您将只有一个文件(而不是两个,正如您在评论中所说的),即csv文件pickle.dumps
返回字符串,而pickle.loads
从字符串加载对象,比较并
然后你像这样读取数据
with open('my_file.csv') as fd:
reader = csv.reader(fd)
row = csv.readrow()
fd_class = get_fd_class_by_version(row[0])
fd = pickle.loads(row[1])
这里的
get\u fd\u class\u by\u version
是一种工厂,返回与存储的版本相关的类。用于打开文件进行读取操作的模式可能有问题。
写入时使用wb
(以二进制模式写入),但读取时使用r
(不以二进制模式读取,省略b
)
如果您在Windows上,这可能是一个问题
请参见此处了解更多详细信息:然后我就有了两个文件。数据和元数据。我真的很想知道为什么我在反序列化时会出现异常,因为元组可以被pickle。请将完整的跟踪放回以获取有关错误消息的帮助,因为没有跟踪。不管怎样,你可以复制我的代码并执行它来重现错误。对,刚刚发现了问题。我在二进制模式下保存,但在非二进制模式下读取。
open(file_path, 'rb') as f