Using cPickle

mmcclaf mmcclaf at gmail.com
Fri Feb 6 16:29:53 EST 2009


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:
			#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.



More information about the Python-list mailing list