如何将压缩(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.delayed
instead加载文件:
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?的主要内容,如果未能解决你的问题,请参考以下文章