Python 2.7 -> Python 3 pickling

9 浏览
0 Comments

Python 2.7 -> Python 3 pickling

我一直在使用Python 2.7来从网上爬取数据并将数据存储在MongoDB中。其中一些数据需要被序列化(使用pandas数据框架),所以我一直在Python 2.7中使用pickle对文件进行序列化。

现在我用Python 3编写了一些新的脚本,但是我在反序列化数据时遇到了兼容性问题(如其他帖子中所指出的使用Python 3反序列化Python 2对象)。由于数据直接来自Mongo,所以这些解决方法都不起作用,因为它们专注于从硬盘读取文件的方法。

以下是一些示例代码:

在2.7中存储数据

pickled_data = pickle.dumps(scraped_data)
local_city.update({'location_name':'Boston'}, {"$set": {"Weather": pickled_data}})

(尝试)在Python 3中反序列化数据

db_cursor = local_city.find_one({"location_name": 'Boston'})
unpickled_data = pickle.loads(db_cursor["Weather"], fix_imports=True)

我尝试使用:

unpickled_data = pickle.loads(db_cursor["Weather"], fix_imports=True)

错误消息

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

unpickled_data = pickle.loads(db_cursor["Weather"], fix_imports=True, encoding='bytes'))

错误消息

TypeError: 文件必须具有'read'和'readline'属性

unpickled_data = pickle.loads(db_cursor["Weather"], fix_imports=True, encoding='latin1'))

错误消息

TypeError: 文件必须具有'read'和'readline'属性

因此,我想知道是否有一种在Python 2.7中进行pickle(并将文件存储在Mongo中)并可以在Python 3中轻松反序列化的方法。

谢谢。

0
0 Comments

Python 2.7 和 Python 3 在 pickling(数据序列化)方面存在一些不兼容的问题。在上述内容中,提到了一个问题,即在使用 Python 2.7 中将数据存储到 MongoDB 数据库中后,想要在 Python 3 中将数据库中的数据提取出来。

出现这个问题的原因是 Python 2.7 和 Python 3 在 pickling 方面的差异。在 Python 2.7 中,pickle 模块使用的是 ASCII 编码格式,而在 Python 3 中改为使用 Unicode 编码格式。因此,直接在 Python 3 中使用 Python 2.7 pickled 数据会导致编码错误。

为了解决这个问题,可以将数据库中的数据导出为文本文件,然后在 Python 3 中使用该文件提取数据。上述内容中提供了一个可以使用的命令:

mongoexport --host localhost --db dbname --collection collectionname --type=csv --out name.txt --fields name,id,etc

此命令将数据库中的数据导出为一个名为 name.txt 的文本文件,使用标准的 CSV 格式保存数据。通过这种方式,可以确保在 Python 3 中正确地提取数据。

需要注意的是,上述内容还提到了在 Python 2.7 中使用 pickle 序列化日期数据的需求,但没有给出具体的解决方法。如果需要在 Python 2.7 中 pickle 日期数据,可以使用 pickle 模块来完成。具体的实现方法可以参考 Python 官方文档中关于 pickle 模块的说明。

总结起来,Python 2.7 和 Python 3 在 pickling 方面存在差异,导致在使用 Python 3 提取 Python 2.7 pickled 数据时会出现编码错误。为了解决这个问题,可以将数据导出为文本文件,在 Python 3 中使用该文件提取数据。另外,如果在 Python 2.7 中需要 pickle 日期数据,可以使用 pickle 模块来完成。

0