Python:将版本号和数据保存到pickle文件中

Python:将版本号和数据保存到pickle文件中,python,serialization,deserialization,pickle,Python,Serialization,Deserialization,Pickle,我正在将一些数据序列化到pickle文件中。不幸的是,数据的结构可能会改变。因此,我在代码中有一个静态版本号,如果数据结构发生更改,该版本号将递增。在这种情况下,pickle文件中的数据无效,应该丢弃 所以我试图保存一个由数据和版本号组成的元组。但是从pickle中恢复它会引发一个UnicodeDecodeError: UnicodeDecodeError:“ascii”编解码器无法解码位置0:序号不在范围(128)中的字节0x80 我想知道你会如何包括一个版本号?将其嵌入文件路径是一种选择,但

我正在将一些数据序列化到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