在python中按顺序读取巨大的CSV文件

Uld*_*tre 11 python csv pandas

我有一个10GB的CSV文件,其中包含我需要使用的一些信息.

由于我的PC上的内存有限,我无法在一个批处理中读取内存中的所有文件.相反,我想迭代地只读取该文件的某些行.

假设在第一次迭代中我想要读取前100个,在第二次那些读取到101到200,依此类推.

有没有一种有效的方法在Python中执行此任务?五月熊猫能提供一些有用的东西吗?或者有更好的(在内存和速度方面)方法?

ryg*_*y72 10

这是简短的回答.

chunksize = 10 ** 6
for chunk in pd.read_csv(filename, chunksize=chunksize):
    process(chunk)
Run Code Online (Sandbox Code Playgroud)

这是很长的答案.

首先,您需要导入pandas和sqlalchemy.以下命令将执行此操作.

import pandas as pd
from sqlalchemy import create_engine
Run Code Online (Sandbox Code Playgroud)

接下来,设置一个指向csv文件的变量.这不是必需的,但它确实有助于重复使用.

file = '/path/to/csv/file'
Run Code Online (Sandbox Code Playgroud)

有了这三行代码,我们就可以开始分析我们的数据了.让我们看看csv文件的"head",看看内容可能是什么样子.

print pd.read_csv(file, nrows=5)
Run Code Online (Sandbox Code Playgroud)

此命令使用pandas的"read_csv"命令仅读取5行(nrows = 5),然后将这些行打印到屏幕上.这使您可以了解csv文件的结构,并确保以对您的工作有意义的方式格式化数据.

在我们实际处理数据之前,我们需要对它做一些事情,以便我们可以开始过滤它以处理数据的子集.这通常是我使用pandas的数据帧,但对于大数据文件,我们需要将数据存储在其他地方.在这种情况下,我们将设置一个本地sqllite数据库,以块的形式读取csv文件,然后将这些块写入sqllite.

为此,我们首先需要使用以下命令创建sqllite数据库.

csv_database = create_engine('sqlite:///csv_database.db')
Run Code Online (Sandbox Code Playgroud)

接下来,我们需要以块的形式迭代CSV文件并将数据存储到sqllite中.

chunksize = 100000
i = 0
j = 1
for df in pd.read_csv(file, chunksize=chunksize, iterator=True):
      df = df.rename(columns={c: c.replace(' ', '') for c in df.columns}) 
      df.index += j
      i+=1
      df.to_sql('table', csv_database, if_exists='append')
      j = df.index[-1] + 1
Run Code Online (Sandbox Code Playgroud)

使用此代码,我们将chunksize设置为100,000以保持块的大小可管理,初始化几个迭代器(i = 0,j = 0)然后运行for循环.for循环从CSV文件中读取一块数据,从任何列名中删除空格,然后将块存储到sqllite数据库(df.to_sql(...))中.

如果您的CSV文件足够大,这可能需要一段时间,但等待的时间是值得的,因为您现在可以使用pandas的'sql'工具从数据库中提取数据而不必担心内存限制.

要立即访问数据,您可以运行如下命令:

df = pd.read_sql_query('SELECT * FROM table', csv_database)
Run Code Online (Sandbox Code Playgroud)

当然,使用'select*...'会将所有数据加载到内存中,这是我们试图摆脱的问题所以你应该从过滤器中抛出你的select语句来过滤数据.例如:

df = pd.read_sql_query('SELECT COl1, COL2 FROM table where COL1 = SOMEVALUE', csv_database)
Run Code Online (Sandbox Code Playgroud)


Gui*_*ume 6

您可以使用pandas.read_csv()chuncksize参数:

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html#pandas.read_csv

for chunck_df in pd.read_csv('yourfile.csv', chunksize=100):
    # each chunck_df contains a part of the whole CSV
Run Code Online (Sandbox Code Playgroud)