使用 zstandard 压缩 Python 中的文件
Using zstandard to compress a file in Python
所以我正在使用 zstandard
python 库,并且我编写了一个帮助程序 class 和函数来使用上下文解压缩文件。
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)
这非常有效,允许我在使用文件 f
进行 json
转储和加载之前仅使用 with openZstd('filename.zst', 'rb') as f:
。
但是,我在将其概括为写作时遇到了问题,我尝试按照与目前相同的方式遵循文档,但有些东西不起作用。这是我尝试过的:
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
当我使用此 class 打开文件并执行 json.dump([], f)
时,由于某种原因文件最终为空。我想其中一个步骤正在吞噬我的输入,但不知道它可能是什么。
正如 jasonharper 在评论中所建议的,您必须刷新 io
包装器和编写器本身,如下所示:
s = json.dumps({})
iw = io.TextIOWrapper(writer, encoding="utf-8")
iw.write(s)
iw.flush()
writer.flush(zstd.FLUSH_FRAME)
f.close()
这导致数据在文件中,并且文件完整。
所以我正在使用 zstandard
python 库,并且我编写了一个帮助程序 class 和函数来使用上下文解压缩文件。
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)
这非常有效,允许我在使用文件 f
进行 json
转储和加载之前仅使用 with openZstd('filename.zst', 'rb') as f:
。
但是,我在将其概括为写作时遇到了问题,我尝试按照与目前相同的方式遵循文档,但有些东西不起作用。这是我尝试过的:
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
当我使用此 class 打开文件并执行 json.dump([], f)
时,由于某种原因文件最终为空。我想其中一个步骤正在吞噬我的输入,但不知道它可能是什么。
正如 jasonharper 在评论中所建议的,您必须刷新 io
包装器和编写器本身,如下所示:
s = json.dumps({})
iw = io.TextIOWrapper(writer, encoding="utf-8")
iw.write(s)
iw.flush()
writer.flush(zstd.FLUSH_FRAME)
f.close()
这导致数据在文件中,并且文件完整。