【问题标题】:Should I use marshal if I am getting comma errors in JSON (Python)?如果我在 JSON (Python) 中遇到逗号错误,我应该使用 marshal 吗?
【发布时间】:2015-07-13 18:31:31
【问题描述】:

我实际上是在使用 Python 本身转储一个巨大的数据结构(多个列表和字典)并通过套接字将其发送到客户端。

每次我运行程序时,我都会在不同的位置收到ValueError: 'Expecting ',' delimiter: line 1 column 16177 (char 16176)(可能是第 25000 列,也可能是第 13000 列,它一直在变化)。

我应该使用 marshal 而不是 json(甚至是 pickle)吗?对于大文件大小,最可靠的格式是什么?

【问题讨论】:

  • 我有时也会遇到同样的错误,但使用 ':' 代替
  • 在序列化或反序列化时会发生这种情况吗?

标签: python json sockets marshalling pickle


【解决方案1】:

我建议使用pickle(如果您使用的是 Python 2.X,则使用 cPickle),因为它几乎可以序列化任何东西,包括用户定义的类。而且,正如文档所说

marshal 序列化格式不保证可跨 Python 版本移植。因为它的主要工作是支持.pyc 文件,所以Python 实现者保留在需要时以非向后兼容的方式更改序列化格式的权利。 pickle 序列化格式保证在 Python 版本中向后兼容

(强调我的)。

pickle的另一个优势:

pickle 模块会跟踪它已经序列化的对象,因此以后对同一对象的引用不会再次被序列化。 marshal 不会这样做

这对递归对象和对象共享都有影响。 递归对象是包含对自身的引用的对象。 这些不是marshal处理的,实际上是试图marshal 递归对象会使你的 Python 解释器崩溃。对象共享 当有多个对同一对象的引用时发生 被序列化的对象层次结构中的不同位置。 pickle 此类对象仅存储一次,并确保所有其他引用 指向主副本。共享对象保持共享,可以 对于可变对象非常重要。

如果pickle无法序列化某些数据,您也可以使用dill

【讨论】:

  • 那么我该如何将它整合到我当前的结构中呢?我目前有一个从套接字获取数据的循环,我解码为“utf-8”,将其添加到列表中,最后是 json.loads(''.join(alldata))。现在,我将向数组中添加字节对象而不是字符串,那么我该如何压缩它然后 pickle.loads()?
  • @asuna,只需点击我答案中的链接!您可以在 pickle 上找到一些文档。
  • 我无法理解如何加入字节数组,你知道我是否可以只使用 ''.join() 和 pickle.loads()?
  • @asuna,看来您使用的是 Python 3.X,不幸的是我刚刚开始研究它与早期版本之间的区别,因此,您应该首先检查以下是否有效,然后才可以在您的代码中使用它。据我了解,bytesstring 几乎相同,但它们并不完全相等bytes 应该支持string 支持的几乎所有功能。所以,你应该可以做到"".join(...)。如果您正在读取文件(或套接字),则不需要任何bytes。你可以做a=pickle.loads(file.read())
猜你喜欢
  • 1970-01-01
  • 2013-07-30
  • 2022-12-09
  • 1970-01-01
  • 2020-10-18
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多