On Feb 6, 3:09 pm, MRAB <goo...@mrabarnett.plus.com> wrote: > mmcclaf wrote: > > On Feb 6, 10:25 am, Steve Holden <st...@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...@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. -- http://mail.python.org/mailman/listinfo/python-list