如何将压缩(gz)CSV文件读入dask Dataframe?

Posted

技术标签:

【中文标题】如何将压缩(gz)CSV文件读入dask Dataframe?【英文标题】:How to read a compressed (gz) CSV file into a dask Dataframe? 【发布时间】:2017-02-16 21:10:50 【问题描述】:

有没有办法将通过 gz 压缩的 .csv 文件读取到 dask 数据帧中?

我直接试过了

import dask.dataframe as dd
df = dd.read_csv("Data.gz" )

但得到一个 unicode 错误(可能是因为它正在解释压缩字节)有一个 "compression" 参数,但 compression = "gz" 不起作用,到目前为止我找不到任何文档。

使用 pandas,我可以直接读取文件而不会出现问题,只是结果会破坏我的记忆 ;-) 但如果我限制行数,它就可以正常工作。

import pandas.Dataframe as pd
df = pd.read_csv("Data.gz", ncols=100)

【问题讨论】:

好吧,没有任何编码集,常规的 pandas(非 dask)读取就可以了,所以我的猜测是 dask 尝试将压缩的 gz 文件直接作为 ascii 文件读取并变得毫无意义. 【参考方案1】:

这实际上是dask 的长期限制。用dask.delayedinstead加载文件:

import pandas as pd
import dask.dataframe as dd
from dask.delayed import delayed

filenames = ...
dfs = [delayed(pd.read_csv)(fn) for fn in filenames]

df = dd.from_delayed(dfs) # df is a dask dataframe

【讨论】:

我相信问题是关于单个 gz(有效)而不是 zip 文件(在链接的 GitHub 问题中提到了 zip 作为限制)。在这种情况下使用延迟还有什么优势吗? 对不起,我错过了。我想删除我的答案,但我不能,因为它是公认的答案。 顺便说一句:github.com/dask/dask/pull/5064 进入后将立即支持 zip【参考方案2】:

熊猫当前的文档说:

压缩:‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None,默认‘infer’

因为 'infer' 是默认设置,这可以解释为什么它与 pandas 一起工作。

Dask 关于 compression 参数的文档:

字符串,如“gzip”或“xz”。必须支持有效的随机访问。具有与已知压缩算法(gz,bz2)对应的扩展名的文件名将被自动压缩

这表明它也应该至少推断出 gz 的压缩。它没有(在 0.15.3 中仍然没有)可能是一个错误。但是,它正在使用 compression='gzip'。

即:

import dask.dataframe as dd
df = dd.read_csv("Data.gz", compression='gzip')

【讨论】:

【参考方案3】:

没有文件很难说。如果设置编码like # -*- coding: latin-1 -*-怎么办?或者由于 read_csv 是基于 Pandas 的,你甚至可以 dd.read_csv('Data.gz', encoding='utf-8')。以下是 Python 编码列表:https://docs.python.org/3/library/codecs.html#standard-encodings

【讨论】:

好吧,好主意,但仍然得到错误:'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte。当我解压磁盘上的文件并阅读它时,它几乎可以工作,但对于 NaN 类型的抱怨 @Magellan88: 添加error_bad_lines=False

以上是关于如何将压缩(gz)CSV文件读入dask Dataframe?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Dask 从 CSV 文件中采样确切的行数

如何查看 Dask 计算任务的进度?

如何查看Dask Compute任务的进度?

来自延迟 zip csv 的 Dask 数据帧

为啥来自 s3 的 dask read_csv 保留了这么多内存?

如何最大化 from-rest group by 的单机 Dask 性能?