压缩pkl文件

时间:2018-08-28 13:28:10

标签: python encoding base64 pickle

我的要求是将pkl文件转换为base64字符串格式,以便我可以返回包含此字符串以及其他一些内容的json文件。

{                                                                       
    'pkl_file': 'pkl_as_base64_string'                                             
    'content1': 'content1_as_base64_string'
    'content2': 'content2_as_base64_string'                                 
                     .                                                         
                     .                                                   
}

现在我已经尝试使用https://stackoverflow.com/a/26349372/9316658作为参考的代码

with open(DIR_PATH + 'd885d7a4bbb742cbb397c2642339e950.pkl', 'rb') as f:
    data = pickle.load(f)
    serialized_str = base64.b64encode(pickle.dumps(data))
    print serialized_str

我在执行上面的代码时得到了这个

Traceback (most recent call last):
File "/home/bhargav/PycharmProjects/Test/export_import.py", line 8, in <module>
    data = pickle.load(f)
ImportError: No module named ml.model.project_model

当我使用文本编辑器打开pkl文件时,这是前几行

(iml.model.project_model
ProjectModel
p0
(dp1
S'project_predict_pipe'
p2
(iml.pipeline.base
ICVPipeline
p3
(dp4
S'processors'
p5
(lp6
(iml.pi.file.pdf_to_img_pi
PdfFileConvertPI
p7
(dp8
S'process'
p9
Nsba(iml.pi.ocr.file_ocr_pi

我不确定python为什么将pkl文件中的文本解释为python命令(我是python编程的新手,以前从未处理过pkl文件)。另外,pkl文件的大小非常大(1.2 GB)。如何以最有效的方式实现pkl到bas64的转换?任何帮助表示赞赏。 TIA

1 个答案:

答案 0 :(得分:1)

该问题可能与pkl使用您的环境中未知的类型/类这一事实有关。如果编写了此文件,则只需导入/声明缺少的类型(可能是ml.model.project_model)。

无论如何,您想要做的是将pkl中的对象转换为base 64,而不是您所说的文件本身(意思是-不使用pkl本身)。例如,如果pkl包含字典d,则您尝试使用的base64为d。但是-b64encode应该接收一个字符串或缓冲区,因此它将不起作用。

所以-我认为您真正想要做的是将d转储到pkl文件(这是您已经拥有的文件)中,并将文件的内容转换为base64。为此,您无需使用dump,只需-

with open(DIR_PATH + 'd885d7a4bbb742cbb397c2642339e950.pkl', 'rb') as f:
    serialized_str = base64.b64encode(f.read())
    print serialized_str

然后,另一端需要打开base64(使用b64decode),将其写入文件,然后使用pickle.load()打开此文件以获取原始对象(在我的示例中, d)。假设他已经声明了ml.model.project_model模块,这将起作用。