在没有熊猫的情况下,dask read_csv失败

nik*_*tiu 6 python pandas dask

尝试使用DASK是read_csv对文件,其中大熊猫的read_csv这样

dd.read_csv('data/ecommerce-new.csv')
Run Code Online (Sandbox Code Playgroud)

失败并显示以下错误:

pandas.errors.ParserError: Error tokenizing data. C error: EOF inside string starting at line 2
Run Code Online (Sandbox Code Playgroud)

该文件是使用scrapy包含两列的csv文件,其中csv具有两列,一列包含url,另一列包含html(使用多行存储"为定界符char)。实际上,被熊猫解析意味着它应该被正确格式化。

html,url
https://google.com,"<a href=""link"">
</a>"
Run Code Online (Sandbox Code Playgroud)

使sample参数足够大以将整个文件加载到内存中似乎可以正常工作,这使我相信在尝试推断数据类型时它实际上会失败(还有这个问题应该已经解决了https://github.com/dask/dask / issues 1284

有人遇到过这个问题吗?有修复/解决方法吗?

编辑:显然,如果文件在引号之间包含换行符,这是dask的read_csv的已知问题。我发现的一个解决方案是简单地在内存中读取所有内容:

dd.from_pandas(pd.read_csv(input_file), chunksize=25)
Run Code Online (Sandbox Code Playgroud)

这行得通,但要以并行度为代价。还有其他解决方案吗?

Vis*_*dev 2

对于 2020 年来到这里的人来说,它可以dd.read_csv直接用于引号内的换行符。它已被修复。更新到最新版本的 Dask(2.18.1及更高版本)以获得这些好处。

import dask.dataframe as dd
df = dd.read_csv('path_to_your_file.csv')
print(df.compute())
Run Code Online (Sandbox Code Playgroud)

给予,

                 html                    url
0  https://google.com  <a href="link">\n</a>
Run Code Online (Sandbox Code Playgroud)

或者

对于出于某种原因想要使用旧版本的人,正如 @mdurant 所建议的,您可能想要传递blocksize=Nonedd.read_csv该版本,这将以并行加载为代价。