Как json сбросить внутри процесса Zipfile.open? - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь написать json внутри процесса ZipFile BytesIO. Это выглядит так:

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. Сложно, так как он не сообщает об ошибке.

1 Ответ

1 голос
/ 31 января 2020

Ваш код '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)
...