简体   繁体   中英

Working with Python and pickle to save complex data in object

I am experimenting with python to do a script for a program that works with python, and I need to save an object (with custom classes and arrays inside) to a file so that I can read it afterwards (so that I don't have to remake the object everytime, which takes hours)

I was reading in many forums that the easiest way to do that is to use pickle, but I am making a mistake in some place and I don't understand where...

Now, the code would be:

First I define this class:

class Issue_class:
    Title_ID = None
    Publisher_ID = None
    Imprint_ID = None
    Volume = None
    Format = None
    Color = None
    Original = None
    Rating = None
    Issue_Date_Month = None
    Issue_Date_Year = None
    Reprint = None
    Pages = None
    Issue_Title = None
    Number = None
    Number_str = None
    Synopsis = None
    Characters_ID = None
    Groups_ID = None
    Writer_ID = None
    Inker_ID = None
    Colorist_ID = None
    Letterer_ID = None
    CoverArtist_ID = None
    Penciller_ID = None
    Editor_ID = None
    Alternatives_ID = None
    Reprints_ID = None
    Story_ID = None
    Multi = None
    Multistories = None

then I define a list/array for this class:

Issuesdata = []

then during a loop I fill and append these to the list:

    Issuedata = Issue_class()

    Issuedata.Color = "unknown"
    Issuedata.Tagline = "none"
    Issuedata.Synopsis = "none"
    Issuedata.Format = "none"
    Issuedata.Publisher_ID = "none"
    Issuedata.Imprint_ID = -1
    Issuedata.Title_ID = -1
    Issuedata.Volume = "none"
    Issuedata.Number = -1
    Issuedata.Number_str = "none"
    Issuedata.Issue_Title = "none"
    Issuedata.Rating = -1
    Issuedata.Pages = -1
    Issuedata.Issue_Date_Year = 0
    Issuedata.Issue_Date_Month = 0
    Issuedata.Original = True
    Issuedata.Reprint = False
    Issuedata.Multi= True
    Issuedata.Letterer_ID = []
    Issuedata.Characters_ID = []
    Issuedata.Story_ID = []
    Issuedata.Groups_ID = []
    Issuedata.Writer_ID = []
    Issuedata.Penciller_ID = []
    Issuedata.Alternatives_ID = []
    Issuedata.Reprints_ID = []
    Issuedata.Inker_ID = []
    Issuedata.Colorist_ID = []
    Issuedata.Editor_ID = []
    Issuedata.CoverArtist_ID = []
    Issuedata.Multistories = []

Then I work with the data inside the object, and when it is complete, I append it to the list:

Issuesdata.append(Issuedata)

After that I print some info inside one of the objects in the list to be sure everything is ok:

print Issuesdata[3].Title_ID
print Issuesdata[3].Publisher_ID
print Issuesdata[3].Imprint_ID
print Issuesdata[3].Volume
print Issuesdata[3].Format
etc...

And everything is ok, the printed data is perfect

Now, I try to save the list to a file with:

filehandler = open("data.dat","wb")    
pickle.dump(Issuesdata,filehandler)
filehandler.close()

This create the file with info inside... but when I try to read it with:

file = open("data.dat",'rb')
Issuesdat = pickle.load(file)
file.close()

The Python console tells me "'module' object has no attribute 'Issue_class'"

The first thing I thought was that I was reading the file wrong... But then I open the saved file with notepad and inside it it was full of "wrong data", like name of files or name of classes outside the code... which makes me suspect I am dumping the data wrong in the file...

Am I using pickle wrong?

好吧,我发现了问题......看来你必须在主模块中定义你的对象的类才能看到它...我在我工作的模块中定义它并调用pickle命令...

Try using pandas library with simple functions like:

DataFrame.to_pickle(file-path) to save pandas Dataframe in pickle.

pandas.read_pickle(file-path) to read pickle file.

Here you can find pandas reference to_pickle read_pickle .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM