使用Dask读取压缩包中多CSV文件遇msgpack异常求助
解决方案:Dask直接读取Zip归档中的多个CSV文件
针对你遇到的msgpack.exceptions.ExtraData错误,核心原因是Zip路径格式与storage_options参数使用不当,以下是无需解压的可行方案:
方案一:使用标准Zip URL格式
直接在read_csv的路径参数中指定Zip归档路径与内部文件匹配规则,无需额外的storage_options:
import dask.dataframe as dd # 格式:zip://<内部文件匹配规则>@<Zip文件路径> df = dd.read_csv( 'zip://BACI*.csv@../input/baci_hs92.zip', sep=",", dtype={"k":str, "i":int, "j":int, "t":int} ) df.head()
方案二:显式使用ZipFileSystem
通过fsspec的ZipFileSystem直接操作归档内的文件,适合更复杂的归档结构场景:
import dask.dataframe as dd from fsspec.implementations.zip import ZipFileSystem # 初始化Zip文件系统 fs = ZipFileSystem('../input/baci_hs92.zip') # 匹配归档内的目标CSV文件 csv_paths = fs.glob('BACI*.csv') # 读取文件 df = dd.read_csv( csv_paths, sep=",", dtype={"k":str, "i":int, "j":int, "t":int}, storage_options={'fs': fs} ) df.head()
错误原因说明
你原代码中的storage_options={'fo': '../input/baci_hs92.zip'}参数使用错误:fo是fsspec中用于传入文件对象的参数,而非归档文件路径。错误的参数触发了Dask内部不必要的序列化逻辑,最终导致msgpack相关的解析错误。
内容的提问来源于stack exchange,提问作者FlobbyDsk
相关产品推荐
相关产品推荐

