python tempfile + gzip + json dump - PullRequest
       17

python tempfile + gzip + json dump

2 голосов
/ 12 марта 2020

Я хочу вывести очень большой словарь в сжатый файл json, используя python3 (3.5).

import gzip
import json
import tempfile

data = {"verylargedict": True}

with tempfile.NamedTemporaryFile("w+b", dir="/tmp/", prefix=".json.gz") as fout:
    with gzip.GzipFile(mode="wb", fileobj=fout) as gzout:
        json.dump(data, gzout)

Я получил эту ошибку, хотя.

Traceback (most recent call last):
  File "test.py", line 13, in <module>
    json.dump(data, gzout)
  File "/usr/lib/python3.5/json/__init__.py", line 179, in dump
    fp.write(chunk)
  File "/usr/lib/python3.5/gzip.py", line 258, in write
    data = memoryview(data)
TypeError: memoryview: a bytes-like object is required, not 'str'

Есть мысли?

1 Ответ

1 голос
/ 12 марта 2020

Gzip объект не имеет текстового режима. Поэтому я бы создал оболочку для передачи в качестве объекта дескриптора файла. Эта оболочка берет данные из json и кодирует их в двоичном виде для записи в файл gzip:

class wrapper:
    def __init__(self,gzout):
        self.__handle = gzout
    def write(self,data):
        self.__handle.write(data.encode())

используйте так:

json.dump(data, wrapper(gzout))

каждый раз, когда json.dump хочет записать для объекта вызывается метод wrapper.write, который преобразует текст в двоичный файл и записывает в двоичный поток

(некоторые встроенные оболочки из модуля io могут также подходить, но эта реализация проста и работа)

...