如何 json 在 Zipfile.open 进程中转储?

How to json dump inside Zipfile.open process?

我正在尝试在 ZipFile BytesIO 进程中编写 json。它是这样的:

import io
from zipfile import ZipFile
import json

in_memory_zip = io.BytesIO()
with ZipFile(in_memory_zip, 'w') as zipfile:
    with zipfile.open("1/1.json", 'w') as json_file:
        data = {'key': 1}
        json.dump(data, json_file, ensure_ascii=False, indent=4)

稍后保存在 Django 文件字段中。然而它并没有将dump的数据转化为json_file。发现很难,因为它不报告错误消息。

您的代码 'shadows' zipfile,这本身不会成为问题,但如果您稍后在代码中需要 zipfile,则会导致问题。通常,不要隐藏标准库标识符和 Python 关键字。

为什么这是个问题,我不知道,但看起来 json.dump 期望文件指针提供一些东西,而 ZipFile.open() 得到的类文件对象却没有。

这是解决该问题的方法:

import io
from zipfile import ZipFile
import json

in_memory_zip = io.BytesIO()
with ZipFile(in_memory_zip, 'w') as zf:
    with zf.open("1/1.json", 'w') as json_file:
        data = {'key': 1}
        data_bytes = json.dumps(data, ensure_ascii=False, indent=4).encode('utf-8')
        json_file.write(data_bytes)