开发者

pickle.load Not Working

开发者 https://www.devze.com 2023-03-04 07:31 出处:网络
I got a file that contains a data structure with test results from a Windows user. He created this file using the pickle.dump command. On Ubuntu, I tried to load thi开发者_JAVA技巧s test results with

I got a file that contains a data structure with test results from a Windows user. He created this file using the pickle.dump command. On Ubuntu, I tried to load thi开发者_JAVA技巧s test results with the following program:

import pickle
import my_module

f = open('results', 'r')
print pickle.load(f)
f.close()

But I get an error inside pickle module that no module named "my_module".

May the problem be due to corruption in the file, or maybe moving from Widows to Linux is the couse?


The problem lies in pickle's way of handling newline characters. Some of the line feed characters cripple module names in dumped / loaded data.

Storing and loading files in binary mode may help, but I was having trouble with them too. After a long time reading docs and searching I found that pickle handles several different "protocols" for storing data and due to backward compatibility it uses the oldest one: protocol 0 - the original ASCII protocol.

User can select modern protocol by specifing the protocol keyword while storing data in dump file, something like this:

pickle.dump(someObj, open("dumpFile.dmp", 'wb'), protocol=2)

or, by choosing the highest protocol available (currently 2)

pickle.dump(someObj, open("dumpFile.dmp", 'wb'), protocol=pickle.HIGHEST_PROTOCOL)

Protocol version is stored in dump file, so Load() function handles it automaticaly.

Regards


You should open the pickled file in binary mode, especially if you are using pickle on different platforms. See this and this questions for an explanation.

0

精彩评论

暂无评论...
验证码 换一张
取 消