2016-07-08 4 views
0

Я написал небольшой пример кода, чтобы опробовать модуль pickle. Столкнулся с UnicodeDecodeError в инструкции pickle.load(). Написание кодировки = 'utf-8' также не влияет. Вот кодUnicodDecodeError в двоичных файлах

import pickle 

class NewOne: 
    def __init__(self): 
     self.name = "None" 
     self.age = 0 

    def entries(self): 
     self.name = input("Name: ") 
     self.age = input("Age: ") 

obj1 = NewOne() 
for i in range(3): 
    obj1.entries() 
    pickle.dump(obj1, open("Details", "ab")) 

for j in range(3): 
    obj = pickle.load(open("Details",)) 

    if obj.age == 18: 
     print("Name: "+obj.name) 
+1

я не получаю 'UnicodeDecodeError' на Python 2.7 (заменяя 'input' на' raw_input'). BTW, ваш 'pickle.load()' каждый раз загружает первый объект в файл, потому что вы открываете файл на каждой итерации цикла. – SiHa

+0

Я получаю сообщение об ошибке с помощью PyCharm. Итак, что можно сделать, чтобы читать следующий объект каждый раз? Я думал, что это сработает, как на C++. – Abhay

+0

Ну, попробуй это за пределами PyCharm и посмотри, все ли получишь. – SiHa

ответ

0

Основная проблема с вашим кодом в том, что вы добавление к концу того же файл каждый раз, когда вы запускаете скрипт, но загрузка первых три объекта позже.

Фактически, это хуже, чем это; Вы должны нагружать первые три объекта, но на самом деле вы только загружаетесь первым из них каждый раз, потому что вы открываете файл заново в каждой итерации вашей pickle.load()

Может быть, что есть ошибка в начале вашего файла, и вы просто нажимаете это каждый раз, потому что вы загружаете первый объект в файл. Вы можете попытаться удалить файл Details и посмотреть, есть ли у вас ошибка.

Следующий код будет создан новый файл details каждый раз, написать три объекта к нему, а затем загрузить эти три объекта обратно.

import pickle 

class NewOne: 
    def __init__(self): 
     self.name = "None" 
     self.age = 0 

    def entries(self): 
     self.name = raw_input("Name: ") 
     self.age = raw_input("Age: ") 

obj1 = NewOne() 

# Open file for writing. The `with` context manager will automatically close 
# it at the end of the loop 
with open("Details", "wb") as myfile: 
    for i in range(3): 
     obj1.entries() 
     pickle.dump(obj1, myfile) 

# Re-open the file for reading 
with open("Details",) as myfile: 
    for j in range(3): 
     obj = pickle.load(myfile) 

     if obj.age == '18': 
      print("Name: "+obj.name) 

 Смежные вопросы

  • Нет связанных вопросов^_^