Сжатие файла pkl - PullRequest
       15

Сжатие файла pkl

0 голосов
/ 28 августа 2018

Мое требование - преобразовать файл 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 ГБ). Как мне добиться наиболее эффективного преобразования из pkl в bas64? Любая помощь приветствуется. TIA

1 Ответ

0 голосов
/ 28 августа 2018

Проблема, вероятно, связана с тем, что 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.

...