[Tutor] cPickle.load()
Terry Carroll
carroll at tjc.com
Sat Jul 16 19:31:44 CEST 2005
On Sat, 16 Jul 2005, David Jimenez wrote:
> [EOFError on pickle]
First, something that may not be a problem, but let's get it out of the
way, anyway:
> pickle_file=open("pickles1.dat","w")
> . . .
> pickle_file=open("pickles1.dat","rb")
I notice that your write open does not specify binary mode, but your read
open does. If you're on an OS where binary mode matters (e.g., Windows),
you should use it in both places, or the file you write out will probably
be corrupted.
But here's your real problem (I'm adding line numbers in brackets for
reference):
> for i in pickle_file: #1
> i=cPickle.load(pickle_file) #2
> print i #3
> pickle_file.close() #4
On line #1, you're telling it to iterate over the pickel file. That is,
line #1 says, read a line from pickle_file, and assign it to i.
Then, in line #2, bearing in mind you've already taken the first line out
of the file, you're doing a pickle load, starting part-way into the file.
I suspect that, because it's a binary file, your line #1 is putting the
whole file contents into i, and nothing's left in the file to process.
When you do the load, you hit EOF, hence the error.
It should be a big red flag to you that you're modifying variable i both
in line #1 and line #2. That never leads anywhere good.
What I would suggest is that you endlessly loop over a load call, and wrap
it in a try/except combination to exit on EOF. Here's an equivalent to
the above four lines, that takes that approach:
=====================================
try:
while True:
i=cPickle.load(pickle_file)
print i
except EOFError:
pass
pickle_file.close()
=====================================
Hope this helps.
More information about the Tutor
mailing list