我试图在由“解析”的cPickle文件构建的.pkl文件上使用.csv。解析是使用预先构造的python工具箱进行的,该工具箱最近从python 2 (https://github.com/GEMScienceTools/gmpe-smtk)移植到python 3。
我使用的代码如下:
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“)是预构造工具箱的一部分。考虑到这一点,我是否可能需要在此模块中以某种方式更改编码?
发布于 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
sm_database = cPickle.load(open("C:/Python37/TestX10/metadatafile.pkl","rb"))https://stackoverflow.com/questions/55386903
复制相似问题