[Tutor] pickling, writing, reading individual lists from a file
Lie Ryan
lie.1296 at gmail.com
Mon Nov 3 12:15:28 CET 2008
On Sun, 02 Nov 2008 23:20:47 -0800, Dinesh B Vadhia wrote:
> I want to pickle a bunch of lists and write each list separately to a
> fileand then read them back. Here is my code with the EOF error:
>
> filename = 'lists.txt'
> fw = open(filename, 'w')
> for l in m:
> n = pickle.dumps(l, 2) + "\n"
> fw.write(n)
> fw.close()
That is because a pickle.dumps() produces a string of bytes, and may
contain "\n". When you try to read the file, you split the file based on
"\n", since the original pickled items contains "\n", you split the
pickled data in places where it shouldn't be.
To solve your problem, you have several alternative possibilities:
1. just pickle the whole of them
2. put each pickled object in separate file (alternatively zipping them
if you have a lot of them)
3. choose a separator that is guaranteed that pickle wouldn't emit
4. escape the separator you choose
5. put the pickled data in a list/dict, then pickle that list/dict
1.
pickle.dump(m, 'lists.p', 2)
2.
for i, l in enumerate(m):
pickle.dump(l, 'list%s.p' % i, 2)
3.
#from __future__ import with_statement
# uncomment the line above if python version < 2.6
separator = "something pickle wouldn't emit"
with open('lists.txt', 'w') as fw:
for l in m:
n = pickle.dumps(l, 2) + separator
fw.write(n)
4.
separator = "|"
with open('lists.txt', 'w') as fw:
for l in m:
n = escape(pickle.dumps(l, 2)) + separator
fw.write(n)
5.
# since the objects you're pickling is already in a list
# this solution is exactly the same as solution #1
# however, in cases where the object you intend to pickle
# is scattered, you should make a dict/list.
More information about the Tutor
mailing list