Using cPickle

MRAB google at mrabarnett.plus.com
Fri Feb 6 17:04:09 EST 2009


mmcclaf wrote:
> On Feb 6, 3:09 pm, MRAB <goo... at mrabarnett.plus.com> wrote:
>> mmcclaf wrote:
>>> On Feb 6, 10:25 am, Steve Holden <st... at holdenweb.com> wrote:
>>>> mmcclaf wrote:
>>>>> Hi there,
>>>>> I have to make a small database using cPickle. I'm having troubles
>>>>> trying to read in the information if it's more than one line. I'm
>>>>> pretty sure it's in the line "for line in stuff:" Can anyone help me
>>>>> out? Basically the end result is wanting it to look something like
>>>>> what is down below when list is typed in:
>>>>> Last name                 First Name                Email Address
>>>>> Doe                          John
>>>>> j... at doe.com
>>>>> [code]
>>>>> # @author: Ocdt Murray McClafferty 24656
>>>>> # This will manage a small database using the cPickle module.
>>>>> # It must maintain a list of last names, first names and email
>>>>> addresses, and must let a user interact with the program
>>>>> #
>>>>> #!usr/bin/python
>>>>> # -*- coding: utf-8 -*-
>>>>> import sys
>>>>> import cPickle
>>>>> #
>>>>> format = '%s             %s                  %s'
>>>>> try:
>>>>>    filename = sys.argv[1]
>>>>>    input = open(filename, 'r')
>>>>> except IOError:
>>>>>    print 'File is not available, will create a new file now'
>>>>>    lastName='Last Name'
>>>>>    firstName='First Name'
>>>>>    email= 'Email'
>>>>>    #input.close()
>>>>>    output=open (filename, 'w')
>>>>>    total = format%(lastName, firstName, email)
>>>>>    cPickle.dump(total,output)
>>>>>    #cPickle.dump(firstName,output)
>>>>>    #cPickle.dump(email,output)
>>>>>    output.close()
>>>>> except EOFError:
>>>>>    print 'File is empty'
>>>>> #datas = cPickle.load(input)
>>>>> while True:
>>>>>    command=sys.stdin.readline()[:-1]
>>>>>    if command=='list': #lists the data in the file
>>>>>            input = open(filename, 'r')
>>>>>            stuff=cPickle.load(input)
>>>>>            for line in stuff:
>>>>>                    #firstName=cPickle.load(input)
>>>>>                    #email=cPickle.load(input)
>>>>>                    #print repr (lastName).rjust(10), repr(firstName).rjust(20), repr
>>>>> (email).rjust(20)
>>>>>                    stuff=cPickle.load(input)
>>>>>                    print stuff
>>>>>                    print line
>>>>>            input.close()
>>>>>    if command=='exit' or command=='quit' : #NEVER forget the exit!!!
>>>>>            print 'Save changes? y for Yes, n for No'
>>>>>            commandSave=sys.stdin.readline()[:-1]
>>>>>            if commandSave =='y': #if the user wants to save
>>>>>                    output=open(filename, 'w')
>>>>>                    cPickle.dump(work,output)
>>>>>                    output.close()
>>>>>                    sys.exit(0)
>>>>>            if commandSave =='n': #no save
>>>>>                    input.close()
>>>>>                    sys.exit(0)
>>>>>    if command=='add': #adds an entity to the file
>>>>>            print 'Last name?'
>>>>>            lastName=sys.stdin.readline()[:-1]
>>>>>            print 'First name?'
>>>>>            firstName=sys.stdin.readline()[:-1]
>>>>>            print 'Email address?'
>>>>>            email=sys.stdin.readline()[:-1]
>>>>>            work = format%(lastName, firstName, email)
>>>>>            #output=open(filename, 'w')
>>>>>            #data=cPickle.load(output)
>>>>>            #data.append(work)
>>>>>            #output.close()
>>>>>            output=open(filename, 'a')
>>>>>            cPickle.dump(work,output)
>>>>>            output.close()
>>>>> [/code]
>>>>> All help would be appreciated. I am new to Python and this seems to be
>>>>> quite a challenge for me.
>>>> Make sure you use modes "rb" and "wb" when you open the pickle files. If
>>>> you are running on Windows this can make a difference.
>>>> regards
>>>>  Steve
>>>> --
>>>> Steve Holden        +1 571 484 6266   +1 800 494 3119
>>>> Holden Web LLC              http://www.holdenweb.com/
>>> I've tried both rb and wb as well as r and w, there appears to be no
>>> difference in the running of the code.
>> "cPickle.dump(work,output)" writes a string and
>> "stuff=cPickle.load(input)" just reads that string, so "for line in
>> stuff:" is iterating through the characters if the string. You need to
>> use cPickle.load() to read each string (line).
> 
> Ok, so I just modified that section to:
> [code]
> 	if command=='list': #lists the data in the file
> 		input = open(filename, 'r')
> 		stuff=cPickle.load(input)
> 		for line in stuff:
You're still iterating over the string.

> 			#firstName=cPickle.load(input)
> 			#email=cPickle.load(input)
> 			#print repr (lastName).rjust(10), repr(firstName).rjust(20), repr
> (email).rjust(20)
> 			stuff=cPickle.load(input)
> 			print stuff
> 
> 
> 		input.close()
> [/code]
> 
> And now it's printing it out ok, but then I get an EOFError at
> stuff=cPickle.load(onput) at line 45.
> 
You can just keep reading until EOFError occurs, at which point you know
you've reached the end of the file:

input = open(filename, 'rb')
try:
     while True:
         stuff = cPickle.load(input)
         print stuff
except EOFError:
     pass
input.close()



More information about the Python-list mailing list