【问题标题】:reading .csv.zst file with pandas用 pandas 读取 .csv.zst 文件
【发布时间】:2022-11-09 05:08:22
【问题描述】:

我想将.csv.zst 加载到数据框中:

for ex in examples:
    path = root + "f=" + ex + "/" + date
    data = os.listdir(path)
    
    for d in data:
        zst_datapath = path + "/" + d
        with open(zst_datapath, 'rb') as fh:
            data = fh.read()
            dctx = zstd.ZstdDecompressor(max_window_size=2147483648)
            decompressed = dctx.decompress(data)          

我想要做的是将解压缩的文件读取为 csv 文件:

with open(decompressed, 'rb') as f:
    csv_data = f.read()
    csv = pd.read_csv(csv_data)

但是,我收到 File name too long 错误。如何将解压后的数据加载到 pandas 数据框中?

【问题讨论】:

    标签: python-3.x pandas csv zstandard


    【解决方案1】:

    你的主要问题是去之后:

    decompressed = dctx.decompress(data)
    

    变量 decompress 现在包含整个未压缩的数据(因此 csv.zst 的内容本身。 然后当你这样做时:

    with open(decompressed, 'rb') as f:
    

    您正试图打开一个文件姓名是“{您的 csv 内容}”。

    您正在考虑的是制作解压缩数据的输入流。模块io's StringIO 是您要寻找的。你向它传递一个文本内容,你会得到一个类似文件的对象,它的工作方式就好像它来自使用open() 打开的文件一样:

    import io
    
    with io.StringIO(decompressed) as f:
       csv_data = f.read()
       csv = pd.read_csv(csv_data)
       # crashes here:---^
    

    除此之外,这也会崩溃,因为read_csv() 将字符串视为“路径”,所以它会再次查找一个文件姓名是“{您的 csv 内容}”。

    如果你想传递一个文本块给 csv_read,你需要传递 f 对象本身:

    import io
    
    with io.StringIO(decompressed) as f:
       csv = pd.read_csv(f)
    

    这个将要工作,除此之外, csv_read 也可以解压缩文件。 因此,对于最近的 pandas,您实际上可以完全跳过整个“解压缩”部分,直接给出文件名。 Pandas 将负责解压:

    csv = pd.read_csv(zst_datapath)
    

    请注意,不同的压缩方案需要安装不同的依赖项才能工作。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多