2015-07-12 4 views
-1

Я написал базовый класс хранения, который хранит данные в списке списков, записывает их в файл, а затем позволяет прочитать его из файла для сохранения. Он работал над системой, изначально написанной (окна 7). Я переместил ее во вторую систему (окна 8), и теперь она работает неправильно.python unpickling EOFError при чтении файла

Ошибка я получаю это:

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() 

Это, вероятно, случай кода слепоты, как он работал ранее. Любые идеи будут оценены

+0

также следует отметить, что с помощью функции Users.commit() незакомментированной даже тогда, когда данные Allready были поручены и находится в файле, то функция выводит ReadData правильно, когда возвращается из функции фиксации – Lobsterbob

+0

дальнейшей проверки показывает, что когда функция ReadData() называется стиранием содержимого файла pickle ... – Lobsterbob

+0

Я понял, что это было не из-за отсутствия исследований, так как подавляющие голоса могут заставить вас поверить. В верхней части класса я инициализировал файл, который должен быть создан каждый раз, когда модуль запускался, таким образом, он удалял содержимое файла и создавал ошибку, удаляя создание файла и делая его условным решением проблемы. @MihaiHangiu Я был прав, предполагая, что это слепота кода, а также глупость кода, а не отсутствие исследований! – Lobsterbob

ответ

-1

Решение, как представляется, здесь pickle.load() raising EOFError in Windows

т.е. файл должен быть открыт для чтения на двоичном режиме с флагом «RB».

+0

Я видел этот вопрос, однако он все еще не решил проблему, он все еще выводит одно и то же сообщение об ошибке – Lobsterbob

0

Измененный код, который отвечает на вопрос.

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() 
Смежные вопросы