首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python3.7和UnicodeDecodeError上使用python2.7代码时的cPickle

在python3.7和UnicodeDecodeError上使用python2.7代码时的cPickle
EN

Stack Overflow用户
提问于 2019-03-27 21:41:15
回答 1查看 186关注 0票数 1

我试图在由“解析”的cPickle文件构建的.pkl文件上使用.csv。解析是使用预先构造的python工具箱进行的,该工具箱最近从python 2 (https://github.com/GEMScienceTools/gmpe-smtk)移植到python 3。

我使用的代码如下:

代码语言:javascript
复制
from smtk.parsers.esm_flatfile_parser import ESMFlatfileParser
parser=ESMFlatfileParser.autobuild("Database10","Metadata10","C:/Python37/TestX10","C:/Python37/NorthSea_Inc_SA.csv")
import cPickle
sm_database = cPickle.load(open("C:/Python37/TestX10/metadatafile.pkl","r"))

它返回以下错误:

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

从我可以收集到的信息来看,我需要指定我的.pkl文件的编码,以使cPickle能够工作,但是我不知道解析.csv文件所产生的文件上的编码是什么,所以我目前不能使用cPickle来这样做。

我使用了崇高的文本软件来发现它是“十六进制”,但这不是Python 3.7中公认的编码格式,不是吗?

如果有人知道如何确定所需的编码格式,或者如何使十六进制编码在Python3.7中可用,他们的帮助将是非常感谢的。

附注:所使用的模块(如"ESMFlatfileparser“)是预构造工具箱的一部分。考虑到这一点,我是否可能需要在此模块中以某种方式更改编码?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-28 07:44:43

代码以文本模式('r')打开文件,但应该是二进制模式('rb')。

来自文档 for pickle.load (重点雷):

该文件可以是为二进制读取打开的磁盘上文件、io.BytesIO对象或满足此接口的任何其他自定义对象。

由于该文件是以二进制模式打开的,因此不需要向open提供编码参数。可能有必要向pickle.load提供编码参数。来自同一文件:

可选的关键字参数是fix_imports、编码和错误,它们用于控制Python2生成的泡菜流的兼容性支持。如果fix_imports为真,则泡菜将尝试将旧的Python2名称映射到Python3中使用的新名称。编码和错误告诉泡菜如何解码由Python2腌制的8位字符串实例;它们分别默认为‘ASCII’和‘strict’。编码可以是“字节”,将这些8位字符串实例作为字节对象读取。使用编码=‘latin1 1’对NumPy数组和Python2所挑选的日期时间、日期和时间的实例进行清点是必需的。

这应该可以防止UnicodeDecodeError

代码语言:javascript
复制
sm_database = cPickle.load(open("C:/Python37/TestX10/metadatafile.pkl","rb"))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55386903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档