Python &引用;UnicodeDecodeError:&x27;charmap';编解码器可以';t解码";pickle加载错误
我试图在文件中保存一组Tweet对象。Tweet类实例包含utf8编码字符。您可以看到下面的代码:Python &引用;UnicodeDecodeError:&x27;charmap';编解码器可以';t解码";pickle加载错误,python,encoding,utf-8,pickle,Python,Encoding,Utf 8,Pickle,我试图在文件中保存一组Tweet对象。Tweet类实例包含utf8编码字符。您可以看到下面的代码: 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 = p
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>
UnicodeDecodeError:“charmap”编解码器无法解码位置25中的字节0x81:字符映射到
我的机器规格:
Python 3.5.2 | Anaconda 4.2.0(64位)|(默认,2016年7月5日),
win32上的11:41:13)[MSC v.1900 64位(AMD64)]
在Python3中,pickle模块期望底层文件对象接受或返回字节。您正确地以二进制模式打开文件进行写入,但无法以二进制模式进行读取。阅读部分应为:
with open('tweets.dat', 'rb') as f:
all_tweets = pickle.load(f)
参考:摘自pickle.load(fd)
的文档:
…因此,文件可以是为二进制读取而打开的磁盘上文件、io.BytesIO对象或满足此接口的任何其他自定义对象
为什么要以二进制模式写入文件,然后以文本模式读取?我想检索我的对象,然后使用它们。虽然我在这里提到了一个简单的例子,但是Tweet类也可能包含非文本属性。您可以在写入时替换整个
DAT
文件,但您希望将其与外部编码/解码系统一起使用。您还记得“创建此文件时使用的解码方式吗?”。大多数人回答“不知道!”,因为os\u编码
,python编码
,python解码
模式在哪里?谢谢。不幸的是,它不起作用。它返回另一个错误“AttributeError:无法在”@CoderInNetwork:上获取属性“Tweet”:您应该编辑您的问题以添加属性。我用一个稍微修改过的对象测试了您的问题中当前显示的内容(使用非ascii数据),结果成功了。Pickle是一个众所周知且经过良好测试的模块,如果不知道您是如何使用它的,我们将无法帮助您。当对load()使用“rb”模式时,字符串被视为字节,并且考虑到要取消Pickle的数据的大小,将这些字节与Pickle.load(f,encoding='latin1')一起转换回stringsthis可能是一个问题
帮我解决了这个问题