【问题标题】:UnicodeDecodeError when using python 2.7 code on python 3.7 with cPickle在带有 cPickle 的 python 3.7 上使用 python 2.7 代码时出现 UnicodeDecodeError
【发布时间】:2019-03-27 21:41:15
【问题描述】:

我正在尝试在由“已解析”.csv 文件构建的 .pkl 文件上使用 cPickle。使用预先构建的 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。

我用 sublime text 软件发现是“十六进制”,但这不是 Python 3.7 接受的编码格式,不是吗?

如果有人知道如何确定所需的编码格式,或者如何使十六进制编码在 Python 3.7 中可用,我们将不胜感激。

附:诸如“ESMFlatfileparser”之类的模块是预先构建的工具箱的一部分。考虑到这一点,我是否可能需要在此模块中以某种方式更改编码?

【问题讨论】:

    标签: python encoding deserialization pickle


    【解决方案1】:

    代码以 text 模式 ('r') 打开文件,但它应该是 binary 模式 ('rb')。

    来自documentationpickle.load(强调我的):

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

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

    可选的关键字参数是 fix_imports、encoding 和 errors,用于控制对 Python 2 生成的 pickle 流的兼容性支持。如果 fix_imports 为 true,pickle 将尝试将旧的 Python 2 名称映射到 Python 中使用的新名称3.编码和错误告诉pickle如何解码Python 2腌制的8位字符串实例;这些默认分别为“ASCII”和“严格”。编码可以是“字节”,以将这些 8 位字符串实例读取为字节对象。需要使用 encoding='latin1' 来取消 NumPy 数组和由 Python 2 腌制的日期时间、日期和时间的实例。

    这应该防止UnicodeDecodeError:

    sm_database = cPickle.load(open("C:/Python37/TestX10/metadatafile.pkl","rb"))
    

    【讨论】:

    • 在尝试使用以前在 Python 2 版本中工作的打印功能时,从文本模式更改为二进制模式是否会导致错误 ValueError: Unknown format code 'f' for object of type 'str'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 2012-06-07
    • 1970-01-01
    • 2020-02-03
    相关资源
    最近更新 更多