【问题标题】:json.dump to a gzip file in python 3json.dump 到 python 3 中的 gzip 文件
【发布时间】:2015-05-18 08:00:18
【问题描述】:

我正在尝试一步将对象写入 gzip 压缩的 json 文件(最小化代码,并可能节省内存空间)。我最初的想法(python3)是这样的:

import gzip, json
with gzip.open("/tmp/test.gz", mode="wb") as f:
  json.dump({"a": 1}, f)

但这失败了:TypeError: 'str' does not support the buffer interface,我认为这与未编码为字节的字符串有关。那么这样做的正确方法是什么?

我不满意的当前解决方案:

以文本模式打开文件即可解决问题:

import gzip, json
with gzip.open("/tmp/test.gz", mode="wt") as f:
  json.dump({"a": 1}, f)

但是我不喜欢文本模式。在我看来(也许这是错误的,但this 支持),文本模式用于修复行尾。这应该不是问题,因为 json 没有行尾,但我不喜欢它(可能)弄乱我的字节,它(可能)速度较慢,因为它正在寻找要修复的行尾,并且(最差最重要的是)我不明白为什么行尾可以解决我的编码问题?

【问题讨论】:

  • 其实我才意识到gzip-part和这一切无关,我应该重写问题

标签: python-3.x


【解决方案1】:

offtopic:我应该比最初更深入地研究文档。

python docs 节目:

通常,文件以文本模式打开,这意味着您可以从文件中读取和写入字符串,这些字符串以特定编码(默认为 UTF-8)进行编码。附加到模式的“b”以二进制模式打开文件:现在数据以字节对象的形式读取和写入。此模式适用于所有不包含文本的文件。

我不完全同意 json 编码的结果是一个字符串(我认为它应该是一组字节,因为它明确定义它使用 utf-8 编码),但我之前注意到了这一点。所以我猜是文本模式。

【讨论】:

  • 这个stackoverflow.com/a/49535758/1335793引用了文档“json模块总是产生str对象,而不是bytes对象。”我认为这个答案很好地解释了stackoverflow.com/questions/39450065/… json.dump 确实在做两件事,将您的 dict 对象序列化为字符串,然后将其写入具有编码的文件(类似于 file.write() )
  • JSON 模块要么是从一个对象序列化到一个字符串/文件(dumps/dump),要么是从一个字符串/文件反序列化到一个对象(loads/load),而 JSON 是数据的文本表示,旨在作为文本存储或传输,因此确实有意义。
猜你喜欢
  • 2021-09-12
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-08
  • 2011-12-30
  • 1970-01-01
  • 2013-08-08
相关资源
最近更新 更多