LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1779|回复: 4

求救!Python的EOF问题[已解决]

[复制链接]
发表于 2005-9-2 22:45:13 | 显示全部楼层 |阅读模式
初学Python,写了个很菜的程序,实在不知道哪儿出毛病了,请高手看看,谢谢!


  1. #Filename:mab_ver1.py

  2. import cPickle as cp
  3. import sys

  4. mylist='myinfolist.data'
  5. maindict={}
  6. mainlist=[]

  7. class Person:
  8.    def __init__(self,n,a,p):
  9.         self.name=n
  10.         self.addr=a
  11.         self.phon=p
  12.    def writeData(self):   
  13.         f=file(mylist,'w')
  14.         f.close()
  15.         f=file(mylist)
  16.         mainlist=cp.load(f)
  17.         for k,v in mainlist:
  18.             maindict[k]=v
  19.         maindict[self.name]="%s %s"%(self.addr,self.phon)
  20.         mainlist=maindict.items()
  21.         f=file(mylist,'w')
  22.         cp.dump(mainlist,f)
  23.         f.close()

  24. if len(sys.argv)<2:
  25.     print 'No acion specified.'
  26.     sys.exit()

  27. if sys.argv[1].startswith('add'):
  28.     name=raw_input('Please Enter the Name:')
  29.     addr=raw_input('Please Enter the Address:')
  30.     phon=raw_input('Please Enter the Phone Number:')
  31.     p=Person(name,addr,phon)
  32.     p.writeData()
  33.     sys.exit()

  34. if sys.argv[1].startswith('del'):
  35.         name=raw_input('Please Enter the Name You Want to Delete:')
  36.         f=file(mylist,'w')
  37.         mainlist=cp.load(f)
  38.         for k,v in mainlist:
  39.             maindict[k]=v
  40.         if name in mainlist:
  41.             del maindict[name]
  42.         else:
  43.             print "%s doesn't exist" %name
  44.         mainlist=maindict.items()
  45.         cp.dump(mainlist,f)
  46.         f.close()
  47.         sys.exit()
复制代码


每次运行时都会报错:

  1. Traceback (most recent call last):
  2.   File "C:\Python23\Lib\site-packages\Pythonwin\pywin\framework\scriptutils.py", line 310, in RunScript
  3.     exec codeObject in __main__.__dict__
  4.   File "C:\Documents and Settings\zchar\My Documents\mab_ver1.py", line 37, in ?
  5.     p=Person(name,addr,phon)
  6.   File "C:\Documents and Settings\zchar\My Documents\mab_ver1.py", line 19, in writeData
  7.     mainlist=cp.load(f)
  8. EOFError
复制代码
千禧湖的青蛙 该用户已被删除
发表于 2005-9-3 15:24:11 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

发表于 2005-9-3 17:05:49 | 显示全部楼层

帮忙弄下缩进 , 麻烦贴代码务必用 [code] 或 [php]



  1. #Filename:mab_ver1.py

  2. import cPickle as cp
  3. import sys

  4. mylist='myinfolist.data'
  5. maindict={}
  6. mainlist=[]

  7. class Person:
  8.    def __init__(self,n,a,p):
  9.         self.name=n
  10.         self.addr=a
  11.         self.phon=p
  12.    def writeData(self):   
  13.         f=file(mylist,'w')
  14.         f.close()
  15.         f=file(mylist)
  16.         mainlist=cp.load(f)
  17.         for k,v in mainlist:
  18.             maindict[k]=v
  19.         maindict[self.name]="%s %s"%(self.addr,self.phon)
  20.         mainlist=maindict.items()
  21.         f=file(mylist,'w')
  22.         cp.dump(mainlist,f)
  23.         f.close()

  24. if len(sys.argv)<2:
  25.     print 'No acion specified.'
  26.     sys.exit()

  27. if sys.argv[1].startswith('add'):
  28.     name=raw_input('Please Enter the Name:')
  29.     addr=raw_input('Please Enter the Address:')
  30.     phon=raw_input('Please Enter the Phone Number:')
  31.     p=Person(name,addr,phon)
  32.     p.writeData()
  33.     sys.exit()

  34. if sys.argv[1].startswith('del'):
  35.         name=raw_input('Please Enter the Name You Want to Delete:')
  36.         f=file(mylist,'w')
  37.         mainlist=cp.load(f)
  38.         for k,v in mainlist:
  39.             maindict[k]=v
  40.         if name in mainlist:
  41.             del maindict[name]
  42.         else:
  43.             print "%s doesn't exist" %name
  44.         mainlist=maindict.items()
  45.         cp.dump(mainlist,f)
  46.         f.close()
  47.         sys.exit()

复制代码


每次运行时都会报错:

  1. Traceback (most recent call last):
  2.   File "C:\Python23\Lib\site-packages\Pythonwin\pywin\framework\scriptutils.py", line 310, in RunScript
  3.     exec codeObject in __main__.__dict__
  4.   File "C:\Documents and Settings\zchar\My Documents\mab_ver1.py", line 37, in ?
  5.     p=Person(name,addr,phon)
  6.   File "C:\Documents and Settings\zchar\My Documents\mab_ver1.py", line 19, in writeData
  7.     mainlist=cp.load(f)
  8. EOFError
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-3 21:15:44 | 显示全部楼层
谢谢jhuangjiahua ~昨天晚上没仔细去找怎么缩进代码的帖子。
我有个问题百思不得其解,就是在使用cPickle模块的时候,不能先读文件,再写文件。

比如说,我的工作目录下有个储存文件:store.data,里面用cPickle.dump储存着一个字典。现在我想让python用cPickle.load把这个文件中的字典读出来,解释器就会报EOF的错误;我真搞不懂了,先读出储存文件中保存的对象、修改对象、重新储存对象,这个逻辑很普遍啊,python是怎么处理这个逻辑的呢?

希望有人能帮帮忙!小弟先谢过了!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-3 21:51:59 | 显示全部楼层
解决了~最开始,我用了file函数的'a'属性,想直接把新的字典存储进文件里,后来发现这样做的话,使用cPickle.load只会把第一个字典赋值给变量1、第二个字典赋值给变量2...然后我修改了代码,发现问题主要是,在调用cPicke.load之前,如果file打开的文件属性是“读”的话,那么那个文件一定要存在,并且一定不能为空!我之前只考虑了文件的存在与否,而没有过问文件内容,所以有EOF错误。下面是正确的代码:


  1. #Filename:mab_ver1.py

  2. import cPickle as cp
  3. import sys

  4. mylist='myinfolist.data'

  5. class Person:
  6.    def __init__(self,n,a,p):
  7.         self.name=n
  8.         self.addr=a
  9.         self.phon=p
  10.    def writeData(self):   
  11.         f=file(mylist)
  12.         maindict=cp.load(f)
  13.         f.close()
  14.         f=file(mylist,'w')
  15.         maindict[self.name]="%s %s"%(self.addr,self.phon)
  16.         cp.dump(maindict,f)
  17.         f.close()

  18. if len(sys.argv)<2:
  19.       print 'No acion specified.'
  20.       sys.exit()

  21. if sys.argv[1].startswith('add'):
  22.     name=raw_input('Please Enter the Name:')
  23.     addr=raw_input('Please Enter the Address:')
  24.     phon=raw_input('Please Enter the Phone Number:')
  25.     p=Person(name,addr,phon)
  26.     p.writeData()
  27.     sys.exit()

  28. if sys.argv[1].startswith('del'):
  29.         name=raw_input('Please Enter the Name You Want to Delete:')
  30.         f=file(mylist)
  31.         maindict=cp.load(f)
  32.         f.close()
  33.         if name in maindict:
  34.             del maindict[name]
  35.         else:
  36.             print "%s doesn't exist" %name
  37.         f=file(mylist,'w')
  38.         cp.dump(maindict,f)
  39.         f.close()
  40.         sys.exit()

  41. if sys.argv[1].startswith('sear'):
  42.          name=raw_input('Please Enter the Name You Demand:')
  43.          f=file(mylist)
  44.          maindict=cp.load(f)
  45.          f.close()
  46.          if name in maindict:
  47.             print maindict[name]
  48.          else:
  49.             print "%s doesn't exist" %name
  50.          sys.exit()
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表