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)
这行得通,但要以并行度为代价。还有其他解决方案吗?
对于 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=None到dd.read_csv该版本,这将以并行加载为代价。