我想将.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)
请注意,不同的压缩方案需要安装不同的依赖项才能工作。
希望这能有所帮助。