【问题标题】:Programming Python for absolute beginners: Chapter 7 Storing Complex Data为绝对初学者编写 Python 编程:第 7 章存储复杂数据
【发布时间】:2011-02-12 20:01:23
【问题描述】:

我正在学习“面向绝对初学者的 Python 编程”并且一直很开心。这本书是为 Python 2.7 编写的(我认为),但我一直在使用 Python 3 并翻译代码,这是一个有趣的挑战。

我最近遇到了一个不知道如何解决的问题。在标记为:“提取数据并将其写入文件”的部分中有一个示例,您可以在其中运行以下代码:

import cPickle, shelve
print "Pickling lists." variety = ["sweet", "hot", "dill"]
shape = ["whole", "spear", "chip"]
brand = ["Claussen", "Heinz", "Vlassic"]
pickle_file = open("pickles1.dat", "w")
cPickle.dump(variety, pickle_file)
cPickle.dump(shape, pickle_file)
cPickle.dump(brand, pickle_file)
pickle_file.close()

我把它翻译成这个(python 3)

import pickle, shelve
print ("Pickling lists.")
variety = ["sweet", "hot", "dill"]
shape = ["whole", "spear", "chip"]
brand = ["Classen", "Heinz", "Vlassic"]
pickle_file = open("pickles1.dat", "w")
pickle.dump(variety, pickle_file)
pickle.dump(shape, pickle_file)
pickle.dump(brand, pickle_file)
pickle_file.close()

但是,我从 IDLE 得到这个错误/输出:

Pickling lists.
Traceback (most recent call last):
File "/Users/hypernerdcc/Documents/pickles.py", line 11, in <module>
pickle.dump(variety, pickle_file)
File
"/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/pickle.py",
line 1345, in dump
Pickler(file, protocol, fix_imports=fix_imports).dump(obj)
TypeError: must be str, not bytes

有什么想法吗?

【问题讨论】:

    标签: python-3.x


    【解决方案1】:

    您正在尝试将字节(即二进制数据)写入文本文件,该文件仅接受 str。更改文件打开标志,应该是:

    pickle_file = open("pickles1.dat", "wb")
    

    b 将其标记为二进制文件,然后它将接受字节。

    这实际上是书中的一个错误。二进制标志也应该确实存在于 Python 2 代码中。

    【讨论】:

    • b 仅在 Windows 中是必需的;在类 Unix 系统上(OP 正在使用它,从粘贴的回溯中的路径名可以看出),b 绝对什么都不做。
    • 哇,用“wb”代替“b”可以运行代码。感谢您的帮助。
    • 对于那些有类似问题的人来说,在这个例子的后半部分,你需要在行中添加一个“rb”:pickle_file = open("pickles1.dat", " r")
    • @Wooble:因为它在 Windows 上是必需的,所以它应该在那本书中,或者实际上总是存在,否则你的代码可能无法在 Windows 上运行。
    猜你喜欢
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 2016-12-05
    相关资源
    最近更新 更多