当前位置: 首页 > 知识库问答 >
问题:

使用Python读取大型csv文件

闾丘冠玉
2023-03-14

我使用Dask读取2.5GB csv文件,Python给了我错误。这是我写的代码:

import pandas as pd
import numpy as np
import time
from dask import dataframe as df1

s_time_dask = time.time()
dask_df = df1.read_csv('3SPACK_N150_7Ah_PressureDistributionStudy_Data_Matrix.csv')
e_time_dask = time.time()

以下是我从Python得到的错误:

dask_df=df1.read_csv('3SPACK_N150_7Ah_压力分布研究_Data_Matrix.csv'))

文件“C:\ProgramData\Anaconda3\lib\site packages\dask\dataframe\io\csv.py”,第645行,读取返回读取\u(

文件“C:\ProgramData\Anaconda3\lib\site packages\dask\dataframe\io\csv.py”,第525行,read\u pandas head=reader(BytesIO(b\u示例),**kwargs)

文件“C:\ProgramData\Anaconda3\lib\site packages\pandas\io\parsers.py”,第686行,在read\U csv return\U read(文件路径或缓冲区,kwds)中

文件"C:\Program Data\Anaconda3\lib\site-包\熊猫\io\parsers.py",第458行,_readdata=parser.read(nrow)

文件"C:\Program Data\Anaconda3\lib\site-包\熊猫\io\parsers.py",第1196行,在read ret=自己。_engine.read(nrow)

文件“C:\ProgramData\Anaconda3\lib\site packages\pandas\io\parsers.py”,第2155行,在read data=self.\u reader.read(nrows)中

在熊猫中文件"pandas_libs\parsers.pyx",第847行。_libs.parsers.TextReader.read

文件“pandas\libs\parsers.pyx”,第862行,在pandas.\libs.parsers.TextReader.\u读取\u内存不足

文件“pandas_libs\parsers.pyx”,第918行,在pandas._libs.parsers.TextReader._read_行中

文件"pandas_libs\parsers.pyx",行905,在熊猫。_libs.parsers.TextReader。_tokenize_rows

文件“pandas\libs\parsers.pyx”,第2042行,在pandas.\u libs.parsers.raise\u parser\u错误

ParserError:标记数据出错。C错误:第43行中预期1个字段,锯9

你能帮我解决这个问题吗?

谢谢

共有3个答案

马渊
2023-03-14

如果确实需要打开所有数据,可以分块打开,这样就不会占用所有内存:read\u csv()有一个名为chunksize的属性。你可以在kite.com上看到它的工作原理。

您还可以查看pandas文档。

冯宏恺
2023-03-14

简言之:你的记忆不足。您试图将更多的数据加载到python中,超出了机器内存的容量(python的内存使用率高于C/C/etc,但这些语言也会达到极限)。

要解决此问题,您可能需要使用csvreader读取文件,这样您可以逐行读取。然后处理该行,以仅获取所需的列,或逐行启动所需的任何聚合。如果您不能做到这一点,那么如果您确实需要一次将所有数据存储在内存中,那么您需要使用较小的数据集,或者使用具有更多内存的系统。

如果您的文件是2.5G,那么如果您的系统需要大约20GB的内存,我也不会感到惊讶。但正确的估计方法是加载固定数量的行,计算出进程正在使用多少,然后读取两倍于该数量的行,然后再次查看内存使用情况。从较高的数字中减去较低的数字,这可能就是容纳那么多行所需的内存量(大约)。然后,您可以计算所有数据需要多少。

羊舌承天
2023-03-14

您的错误与内存无关。Dask通过选择固定的字节偏移量,然后从每个偏移量扫描到最近的换行符,以块方式加载像CSV这样的文本文件。这样,您就可以从多个进程甚至多台机器访问同一个文件,并且一次只能处理与工作线程一样多的块。

不幸的是,换行符并不总是意味着行的结尾,因为它们可能发生在某些文本字段的引用字符串中。这意味着您基本上无法用dask的read_csv读取文件,除非您抢先找到一组字节偏移,以保证干净的分区,而不会在引用的字符串中间中断。

 类似资料:
  • 问题内容: 我目前正在尝试从Python 2.7中的.csv文件中读取数据,该文件最多包含100万行和200列(文件范围从100mb到1.6gb)。对于少于300,000行的文件,我可以(非常缓慢地)执行此操作,但是一旦超过该行,就会出现内存错误。我的代码如下所示: 在getstuff函数中使用else子句的原因是,所有符合条件的元素都将一起列在csv文件中,因此,经过它们以节省时间时,我离开了循

  • 问题内容: 我正在尝试使用Python(仅法语和/或西班牙语字符)读取带有重音字符的CSV文件。基于csvreader的Python 2.5文档(http://docs.python.org/library/csv.html),由于csvreader仅支持ASCII,因此我想出了以下代码来读取CSV文件。 以下是我尝试阅读的CSV文件的摘录: 即使我尝试将编码/解码为UTF-8,我仍然收到以下异常

  • 问题内容: 我想从CSV读取巨大的数据,包含大约500,000行。我正在使用OpenCSV库。我的代码是这样的 多达200,000条记录,数据被读入User Bean对象列表。但是对于更多的数据,我得到了 我在“ eclipse.ini”文件中有此内存设置 我正在考虑将大文件拆分为单独文件并再次读取这些文件的解决方案,我认为这是一个冗长的解决方案。 还有什么其他方法可以避免OutOfMemoryE

  • 问题内容: 我目前正在尝试从Python 2.7中的.csv文件中读取数据,该文件最多包含100万行和200列(文件范围从100mb到1.6gb)。对于少于300,000行的文件,我可以(非常缓慢地)执行此操作,但是一旦超过该行,就会出现内存错误。我的代码如下所示: 在getstuff函数中使用else子句的原因是,所有符合条件的元素都将一起列在csv文件中,因此当我经过它们时,为了节省时间,我离

  • 问题内容: 当我卷曲到API调用链接时http://example.com/passkey=wedsmdjsjmdd 我以csv文件格式获取员工输出数据,例如: 如何使用python解析。 我试过了: 但它不起作用,我出现了一个错误 谢谢! 问题答案: 您需要替换为urllib.urlopen或urllib2.urlopen。 例如 这将输出以下内容 最初的问题被标记为“ python-2.x”,

  • 问题内容: 我正在尝试解析一个csv文件,并仅从特定列中提取数据。 范例csv: 我想只捕获特定的列,说,,和。 我看过的代码使我相信我可以通过其对应的编号来调用特定的列,即:将对应于2并遍历每一行使用会产生列2中的所有项目。只有它不能。 到目前为止,这是我所做的: 并且我希望这只会打印出我想要的每一行的特定列,除非不是,我只会得到最后一列。 问题答案: 你会得到从这个代码的最后一列的唯一方法是,