【问题标题】:python unpickling EOFError when Reading file读取文件时python unpickling EOFError
【发布时间】:2015-07-12 12:40:10
【问题描述】:

我编写了一个基本的存储类,它将数据保存在列表列表中,然后将其写入文件,然后允许从文件中读回以保持持久性。它在最初编写的系统(windows 7)上运行,我将它移到第二个系统(windows 8),现在它似乎出现故障。

我收到的错误是:

Traceback (most recent call last):
File "D:\Code Vault\pydb.py", line 69, in <module>
print Users.ReadData()
File "D:\Code Vault\pydb.py", line 23, in ReadData
self.data = cPickle.load(self.Inputstream)
EOFError

类的完整代码如下

class table():

    #TODO Insert Key Feild to facilitate ID Search 

    def __init__(self,*args):
        self.tablename = args[0]
        self.data = []
        self.colnames = {}
        self.filename = str(self.tablename)+ ".p"

        for e in args[1:]:
            self.colnames.update({e:len(self.colnames)})

        self.Filestorage = open(self.filename, "wb" )
        self.Filestorage.close()

    def ReadData(self):

        self.Inputstream = open(self.filename, "rb")
        self.Inputstream.seek(0)
        self.data = cPickle.load(self.Inputstream)
        self.Inputstream.close()
        return self.data

    def AddData (self, *args):
        self.tempdata = []

        for e in args:
            self.tempdata.append(e)
        if len(args) == len(self.colnames):
            self.data.append(self.tempdata)
        else:
            return "Incorrect argument quantities"
        return self.tempdata


    def Commit(self):
        self.Outputstream = open(self.filename, "ab" )
        cPickle.dump(self.data, self.Outputstream)
        self.Outputstream.close()
        return self.ReadData()

    def Search(self,query):
        for e in self.ReadData():
            if query in e:
                return self.ReadData().index(e)
        else:
            return "Value " + str(query) + " does not exist"

    def Update(self,query, edit):
        for e in self.data:
            if query in e:
                e[e.index(query)] = edit
        return self.data

    def DumpTable(self):
        self.data = []
        self.Outputstream = open(self.filename+".p", "wb" )
        cPickle.dump(self.data, self.Outputstream)
        self.Outputstream.close()
        self.ReadData()

Users = table("Users","Username","Password")
Users.AddData("bob","123456")
# Users.Commit()
# print Users.data
# print Users.filename
# print Users.data
print Users.ReadData()

这可能是代码盲目的情况,因为它以前工作过。任何想法将不胜感激

【问题讨论】:

  • 还应该注意的是,即使数据已经提交并且在文件中,Users.commit() 函数也未注释,当从提交函数返回时,ReadData 函数正确输出
  • 进一步检查表明,当调用 ReadData() 函数时,它正在擦除泡菜文件的内容...
  • 我想通了,这不是因为缺乏研究,因为反对票可能会让你相信。在类的顶部,我已经初始化了每次运行模块时要创建的文件,因此它正在擦除文件的内容并产生错误,删除文件创建并使其有条件地解决了问题。 @MihaiHangiu 我假设这是代码盲目和代码愚蠢而不是缺乏研究是正确的!

标签: python pickle


【解决方案1】:

回答问题的修改后的代码。

import pickle

class table():

    #TODO Insert Key Feild to facilitate ID Search 

    def __init__(self,*args):
        self.tablename = args[0]
        self.data = []
        self.colnames = {}
        self.filename = str(self.tablename)+ ".p"

        for e in args[1:]:
            self.colnames.update({e:len(self.colnames)})

        try:                                      #creating this conditional prevented the contents being erased upon instantiating the class
            f = open(self.filename,"rb")
        except IOError:
            self.createfile = open(self.filename, "wb" )
            self.createfile.close()

    def ReadData(self):
        self.Inputstream = open(self.filename, "rb")
        self.data = pickle.load(self.Inputstream)
        self.Inputstream.close()
        return self.data

    def AddData (self, *args):
        self.tempdata = []

        for e in args:
            self.tempdata.append(e)
        if len(args) == len(self.colnames):
            self.data.append(self.tempdata)
        else:
            return "Incorrect argument quantities"
        return self.tempdata

    def Commit(self):
        self.Outputstream = open(self.filename, "wb" )
        pickle.dump(self.data, self.Outputstream)
        self.Outputstream.close()

    def createfile(self):
        self.createfile = open(self.filename, "wb" )
        self.createfile.close()

    def Search(self,query):
        for e in self.ReadData():
            if query in e:
                return self.ReadData().index(e)
        else:
            return "Value " + str(query) + " does not exist"

    def Update(self,query, edit):
        for e in self.data:
            if query in e:
                e[e.index(query)] = edit
        return self.data

    def DumpTable(self):
        self.data = []
        self.Outputstream = open(self.filename+".p", "wb" )
        pickle.dump(self.data, self.Outputstream)
        self.Outputstream.close()
        self.ReadData()

【讨论】:

    【解决方案2】:

    解决方案似乎在这里pickle.load() raising EOFError in Windows

    即文件需要打开以在带有“rb”标志的二进制模式下读取。

    【讨论】:

    • 我已经看到了这个问题,但是它仍然没有解决问题它仍然输出相同的错误消息
    猜你喜欢
    • 2014-01-28
    • 1970-01-01
    • 2021-07-30
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多