python-3.x 逐行流式传输.zst压缩文件

eimct9ow  于 2023-10-21  发布在  Python
关注(0)|答案(1)|浏览(189)

我试图筛选一个压缩在. zst中的大型数据库。我知道我可以简单地将其重新加载,然后处理生成的文件,但这会占用我的SSD上的大量空间,并需要2个多小时,所以我想避免,如果可能的话。
通常,当我处理大文件时,我会使用以下代码逐行处理它,

with open(filename) as f:
    for line in f.readlines():
        do_something(line)

我知道gzip有这个

with gzip.open(filename,'rt') as f:
    for line in f:
        do_something(line)

但它似乎不与.zsf工作,所以我想知道是否有任何库可以以类似的方式对解压缩后的数据进行压缩和流式传输。举例来说:

with zstlib.open(filename) as f:
    for line in f.zstreadlines():
        do_something(line)
h6my8fg2

h6my8fg21#

import io
import zstandard as zstd
from pathlib import Path
import json

DCTX = zstd.ZstdDecompressor(max_window_size=2**31)

def read_lines_from_zst_file(zstd_file_path:Path):
    with (
        zstd.open(zstd_file_path, mode='rb', dctx=DCTX) as zfh,
        io.TextIOWrapper(zfh) as iofh
    ):
        for line in iofh:
            yield line       

if __name__ == "__main__":
    file = Path('some_zstd_file.zst')
    records = map(json.loads, read_lines_from_zst_file(file))
    for record in records:
        print(record.get('some-field'))

相关问题