用pandas读取.csv.zst文件



我想将.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数据帧中?

您的主要问题是:

decompressed = dctx.decompress(data)

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

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

您正试图打开一个名称为"的文件;{csv的内容}";。

您正在考虑的是制作解压缩数据的输入流。Module io的StringIO就是您想要的。你给它传递一个文本内容,你得到一个类似文件的对象,它的工作方式就像它来自用open():打开的文件

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

除此之外,THIS也将崩溃,因为read_csv()将字符串视为";路径";,因此它将再次查找其名称为"的文件;{csv的内容}";。

如果要将文本块传递给csv_read,则需要传递f对象本身:

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

这个工作,除此之外,read_csv还可以解压缩文件。因此,对于最近的熊猫,你实际上可以完全跳过整个";解压缩";部分,并直接给出文件名。熊猫将负责解压:

csv = pd.read_csv(zst_datapath)

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

希望这能有所帮助。

相关内容

  • 没有找到相关文章

最新更新