2016-12-21 12 views
0

Я пытаюсь сохранить массив объектов Tweet в файле. Чистые экземпляры классов содержат символы кодировки utf8. вы можете увидеть код ниже:"UnicodeDecodeError: кодек charmap не может декодировать" ошибку при загрузке pickle

class Tweet: 
    author=''; 
    text=''; 
    time=''; 
    date=''; 
    timestamp=''; 

with open('tweets.dat','wb') as f: 
    pickle.dump(all_tweets,f) 

with open('tweets.dat') as f: 
    all_tweets = pickle.load(f) 

Когда я запускаю код, он возвращает исключение на pickle.load (F) линия о том, что:

UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 25: character maps to <undefined> 

Моя машина спецификации:

Python 3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul 5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)] on win32

+0

Почему вы пишете в файл в двоичном режиме и читать из него в текстовом режиме? –

+0

Я хочу получить мои объекты, а затем использовать их. Хотя я упомянул здесь простой случай, класс Tweet также может содержать нетекстовые атрибуты. – CoderInNetwork

+0

Вы заменяете весь файл 'DAT' на запись, но хотите использовать его с внешней системой кодирования/декодирования. Вы помните, «какое декодирование используется при создании этого файла?» , Большинство ответов «Не знаю!» , cos, где 'os_encoding',' python encode', 'python decode' шаблоны? – dsgdfg

ответ

4

В Python 3 модуль pickle ожидает, что базовые файловые объекты будут принимать или возвращать байт. Вы правильно открываете файл в двоичном режиме для записи, но не смогли сделать то же самое для чтения. Считанные часть должна быть:

with open('tweets.dat', 'rb') as f: 
    all_tweets = pickle.load(f) 

Ref: экстракт из документации pickle.load(fd):

...Thus file can be an on-disk file opened for binary reading, an io.BytesIO object, or any other custom object that meets this interface.

+0

спасибо. к сожалению, он не работает. он возвращает еще одну ошибку: «AttributeError: не удается получить атрибут« Tweet »на« – CoderInNetwork

+0

@CoderInNetwork: вы должны отредактировать свой вопрос, чтобы добавить [mcve]. Я тестировал несколько измененный объект того, что в данный момент отображается в вашем вопросе (используя данные без ascii), и он сработал. Pickle - хорошо известный и хорошо протестированный модуль, не зная точно, как вы его используете, мы не сможем вам помочь. –

+0

Вы правы. Код работает нормально. благодаря – CoderInNetwork