[英]Python: Saving version number and data into pickle file
我正在将一些数据序列化为pickle文件。 不幸的是,数据的结构可能会改变。 因此,我在代码中有一个静态VERSION编号,如果数据结构已更改,则该编号将递增。 在这种情况下,pickle文件中的数据无效,应将其丢弃。
因此,我试图保存一个由数据和版本号组成的元组。 但是从pickle中恢复它会引发UnicodeDecodeError :
UnicodeDecodeError:'ascii'编解码器无法解码位置0的字节0x80:序数不在范围内(128)
我不知道您将如何包含版本号? 将其嵌入文件路径是一种选择,但要复杂得多。 这是我的代码:
#%% 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')
您用于读取操作打开文件的模式可能存在问题。 对于写入,您使用wb
(以二进制模式写入),而对于读取,您使用r
(不以二进制模式读取,则省略b
)。
open(file_path, 'rb') as f
如果您使用的是Windows,这可能是个问题。
请参阅此处以获取更多详细信息: https : //docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files
如果您真的想使用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
从一个字符串加载对象,比较https://docs.python.org/3/library/pickle.html#pickle.dumps和https://docs.python.org /3/library/pickle.html#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_fd_class_by_version
是一种工厂,它根据您存储的版本返回类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.