我试图在谷歌云存储桶中存储pickle对象。这是谷歌提供的机器学习管道[教程][1]的一部分,我正在关注。我将代码分解为一个最小的示例,该示例仍然抛出相同的错误。在我的实际代码中,对象是一个类实例。
import tensorflow as tf
import dill as pickle
obj = {'foo': 'bar'}
with tf.io.gfile.GFile(filename, 'wb') as f:
pickle.dump(obj, f, protocol=pickle.HIGHEST_PROTOCOL)
当我运行这个时,我得到
TypeError: Expected binary or unicode string, got
在教程中,这一步工作得很好,因为它使用了Tensorflow 1和tf.io.gfile.Open(),它在Tensorflow 2中被删除并被上面的命令所取代。简单地使用open()也可以,但这当然不能帮助我向bucket写入内容。我也试过
with tf.io.gfile.GFile(filename, 'wb') as f:
f.write(obj)
,但返回相同的错误。请让我知道我做错了什么,或者是否有另一种方法可以将pickle对象直接存储到桶中?非常感谢您的帮助![1]: https://cloud.google.com/dataflow/docs/samples/molecules-walkthrough
概述我不知道为什么原来的代码示例不起作用。但这对我来说很管用:
import codecs
import dill as pickle
import tensorflow as tf
def dump(obj, filename):
""" Wrapper to dump an object to a file."""
with tf.io.gfile.GFile(filename, "wb") as f:
pickled = codecs.encode(
pickle.dumps(obj, protocol=pickle.HIGHEST_PROTOCOL),
"base64").decode()
f.write(pickled)
def load(filename):
""" Wrapper to load an object from a file."""
with tf.io.gfile.GFile(filename, "rb") as f:
pickled = f.read()
return pickle.loads(codecs.decode(pickled, "base64"))
版本号:Python 3.7.9, TensorFlow 2.3.0
您可能还需要
import pickle5 as pickle
for Python 3.7.9