【问题标题】:error in loading pickle加载泡菜时出错
【发布时间】:2017-07-28 08:13:24
【问题描述】:

无法加载 pickle 文件。我正在使用 python 3.5

import pickle
data=pickle.load(open("D:\\ud120-projects\\final_project\\final_project_dataset.pkl", "r"))

TypeError: 需要一个类似字节的对象,而不是 'str'

。 .

也试过了:

import pickle
data=pickle.load(open("D:\\ud120-projects\\final_project\\final_project_dataset.pkl", "rb"))

UnpicklingError: STRING 操作码参数必须被引用

。 .

即使使用 with 语句也会出现同样的错误

import pickle
with open("D:\\ud120-projects\\final_project\\final_project_dataset.pkl", "rb") as f:
    enron_data = pickle.load(f)

【问题讨论】:

    标签: python python-3.x pickle pickler


    【解决方案1】:

    我使用的是windows 10和vscode,你应该去final_project_dataset.pkl文件,然后将选项CRLF改为LF然后保存文件然后UnpicklingError: the STRING opcode argument must be quoted错误就会消失。

    将 CRLF 更改为 LF

    然后保存 final_project_dataset.pkl 文件。

    【讨论】:

    • 这个答案帮助了我的朋友。他的名声很差,所以我代表他发表评论。
    • 对于任何显示此错误的 .pkl 文件,此解决方案都有效(适用于 Udacity 的机器学习课程)
    【解决方案2】:

    你肯定需要“rb”来读取文件,这就解决了第一个问题。

    第二个问题(STRING 操作码参数)是因为文件没有 Unix 行结尾。您需要通过脚本运行 pkl 文件来转换它们。如果你看到这个帖子,有一个名为“dos2unix”的脚本会为你解决这个问题:

    How to convert DOS/Windows newline (CRLF) to Unix newline (\n) in a Bash script?

    【讨论】:

    【解决方案3】:

    如果整个脚本让你失望,那真的只需要一行:

    import pickle
    with open("D:\\path\\to\\file.data", "rb") as f:
        lines = [line.rstrip("\r\n") for line in f.readlines()]
        data = pickle.loads("\n".join(lines))
    

    【讨论】:

    • 我真的很喜欢它的简洁性,但是当我尝试这个时,列表理解行会抛出TypeError: a bytes-like object is required, not 'str'。我在open() 中使用'rb'。有什么建议么?我正在使用 Python 3.8.5、Windows 10、Jupyter Notebook。
    • 'readlines()' 输出是二进制输出的列表(例如[b'(lp0\r\n', b"S' sbaile2'\r\n"],而rstrip() 似乎无法处理它;f.readlines()[0].rstrip('\r\n') 抛出相同的错误。是否有将二进制项转换为字符串然后在替换它们的结束线后将它们转换回二进制的简洁方法?
    【解决方案4】:

    对我来说唯一的解决方法是(由 Github 中的 Monkshow92 回答):

    " pickle 文件必须使用 Unix 新行,否则至少 Python 3.4 的 C pickle 解析器会失败并出现异常:pickle.UnpicklingError: the STRING opcode argument must bequoted 我认为某些 git 版本可能会将 Unix 新行('\n')更改为 DOS 行('\r\n')。

    您可以使用此代码将“word_data.pkl”更改为“word_data_unix.pkl”,然后在脚本“nb_author_id.py”上使用新的 .pkl 文件: dos2unix.txt

    #!/usr/bin/env python
    """
    convert dos linefeeds (crlf) to unix (lf)
    usage: dos2unix.py 
    """
    original = "word_data.pkl"
    destination = "word_data_unix.pkl"
    
    content = ''
    outsize = 0
    with open(original, 'rb') as infile:
        content = infile.read()
    with open(destination, 'wb') as output:
        for line in content.splitlines():
            outsize += len(line) + 1
            output.write(line + str.encode('\n'))
    
    print("Done. Saved %s bytes." % (len(content)-outsize))
    

    dos2unix.py 改编自: http://stackoverflow.com/a/19702943

    我发现的小调整是,将“r”模式更改为“rb”字节对象模式。 最后使用上面的 python 脚本转换所有 .pkl 文件以从 Dos 转换为 Unix!

    回答链接:https://github.com/udacity/ud120-projects/issues/46 完整学分:Monkshow92

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      • 2018-07-29
      • 2017-10-09
      • 1970-01-01
      相关资源
      最近更新 更多