Использование zstandard для сжатия файла в Python
Так что я использую
zstandard
python, и я написал вспомогательный класс и функцию для использования контекстов для распаковки файлов.
class ZstdReader:
def __init__(self, filename):
self.filename = filename
def __enter__(self):
self.f = open(self.filename, 'rb')
dctx = zstd.ZstdDecompressor()
reader = dctx.stream_reader(self.f)
return io.TextIOWrapper(reader, encoding='utf-8')
def __exit__(self, *a):
self.f.close()
return False
def openZstd(filename, mode='rb'):
if 'w' in mode:
return ZstdWriter(filename)
return ZstdReader(filename)
Это действительно хорошо работает и позволяет мне просто использовать
with openZstd('filename.zst', 'rb') as f:
перед использованием файла
f
за
json
сброс и погрузка. Однако у меня возникают проблемы с обобщением этого текста, я пытался следовать документации так же, как и до сих пор, но что-то не работает. Вот что я пробовал:
class ZstdWriter:
def __init__(self, filename):
self.filename = filename
def __enter__(self):
self.f = open(self.filename, 'wb')
ctx = zstd.ZstdCompressor()
writer = ctx.stream_writer(self.f)
return io.TextIOWrapper(writer, encoding='utf-8')
def __exit__(self, *a):
self.f.close()
return False
Когда я открываю файл с помощью этого класса и выполняю
json.dump([], f)
, файл по какой-то причине оказывается пустым. Я предполагаю, что один из шагов поглощает мой вклад, но понятия не имею, что это могло быть.
1 ответ
Как предложил jasonharper в комментариях, вы должны очистить как
io
обертка и сам писатель, а именно:
s = json.dumps({})
iw = io.TextIOWrapper(writer, encoding="utf-8")
iw.write(s)
iw.flush()
writer.flush(zstd.FLUSH_FRAME)
f.close()
Это приводит к тому, что данные находятся в файле, и файл завершен.