Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python &引用;UnicodeDecodeError:&x27;charmap';编解码器可以';t解码";pickle加载错误_Python_Encoding_Utf 8_Pickle - Fatal编程技术网

Python &引用;UnicodeDecodeError:&x27;charmap';编解码器可以';t解码";pickle加载错误

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

我试图在文件中保存一组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 = 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可能是一个问题
帮我解决了这个问题