如何使用 joblib 追加数据?

How to append data using joblib?

我正在尝试在我的工作流程中的不同点使用 joblib.dump() 保存数据,并希望在我沿着工作流程移动时将数据附加到我的保存文件中。当我尝试这样做时,我每次都会得到原始字典,但没有附加任何内容。我使用的语法类似于 json.dump().

这是我尝试过的:

foo_path = base_directory + r'append_try.pkl' # note base_directory is a full absolute path
init_data = {'yummy': 1, 'funny': 2}
second_data = {'sunny': 3, 'runny': 4}
# dump initial data
with open(foo_path, 'wb') as io:
    joblib.dump(init_data, io)

现在只需确保它有效:

with open(foo_path, 'rb') as io:
    foo_dat = joblib.load(io)
print(foo_dat)  #this works

现在尝试附加 second_data,然后加载文件以查看它是否有效:

# Similar syntax to json.dump
with open(foo_path, 'ab') as io:
    joblib.dump(second_data, io)

# see if it worked
with open(foo_path, 'rb') as io:
    foo_dat2 = joblib.load(io)
print(foo_dat2)

这只是 returns 初始 data.Note 我也尝试将写入模式指定为 a+bab+。那些也没有用。此外,虽然这是一个简单的数字示例,但在我的应用程序中我正在保存 numpy 数组,所以我不能只使用 json.dump().

作为解决方法,我目前正在将附加信息附加到代码中的字典中,并覆盖文件。

我不是特别熟悉 joblib 库,但由于您两次转储到文件中,这将创建一个包含两个对象的文件,而不是两个对象的列表。所以你可能需要从同一个文件对象中加载两次:

with open(foo_path, 'rb') as io:
    foo_dat1 = joblib.load(io)
    foo_dat2 = joblib.load(io)

如果 joblib.load() 方法知道只准确读取它需要读取的内容并将文件对象留在下一个对象的开头,则读取串联文件可能会起作用,就像 pickle.load() 它是基于。需要注意的是 json.load() 也不支持读取串联的 json ,它希望文件只包含一个完整的 JSON 对象,如果你尝试会引发额外数据错误读取通过将多个对象连接到一个文件中创建的文件。