繁体   English   中英

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

[英]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.dumpshttps://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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM