Python 逐行读取csv文件并保存满足特定条件的行

Python 逐行读取csv文件并保存满足特定条件的行,python,file-read,Python,File Read,我有一个已经在几个主题中讨论过的问题,不过我想再深入一点,也许能找到更好的解决方案 因此,我们的想法是使用python遍历“巨大”(50到60GB).csv文件,找到满足某些条件的行,提取它们,最后将它们存储在第二个变量中以供进一步分析 最初的问题是r脚本(我使用SparkyR连接来管理)的问题,或者最终是bash中的一些gawk代码(参见awk或gawk)的问题,以提取我需要的数据,然后用r/python进行分析 我想专门用python来解决这个问题,其想法是避免混合使用bash/python

我有一个已经在几个主题中讨论过的问题,不过我想再深入一点,也许能找到更好的解决方案

因此,我们的想法是使用python遍历“巨大”(50到60GB).csv文件,找到满足某些条件的行,提取它们,最后将它们存储在第二个变量中以供进一步分析

最初的问题是r脚本(我使用SparkyR连接来管理)的问题,或者最终是bash中的一些gawk代码(参见awk或gawk)的问题,以提取我需要的数据,然后用r/python进行分析

我想专门用python来解决这个问题,其想法是避免混合使用bash/python或bash/R(unix)等语言。到目前为止,我使用openasx,一行一行地浏览文件,它可以工作,但速度非常慢。例如,浏览文件非常快(每秒约500.000行,即使是58M行也可以),但当我尝试存储数据时,速度会下降到每秒约10行。对于约300000行的提取,这是不可接受的

我尝试了几种解决方案,我猜它不是最优的(糟糕的python代码?:(),最终会有更好的解决方案

解决方案1:浏览文件,将行拆分成一个列表,检查条件,如果确定,则将行放入numpy矩阵中,并对满足条件的每次迭代执行vstack(非常慢)

导入csv
进口numpy
进口大熊猫
从TQM导入TQM
日期_first='2008-11-01'
最后日期='2008-11-10'
a=numpy.array(['colnames']*35)#数据为35列
索引=列表()
以open(“data.csv”、“r”)作为f:
对于tqdm中的行(f,unit=“每行”):
行=行。拆分(sep=“;”)#csv和“。。。
日期文件=第[1][0:10]行#第2列中存储的日期

如果date\u file>=date\u first和date\u file=date\u first和date\u file附加到数据帧和numpy数组非常昂贵,因为每次附加都必须将整个数据复制到一个新的内存位置。相反,您可以尝试分块读取文件,处理数据,然后再重新附加。这里我选择了块大小100000,但您可以要彻底改变这一点

我不知道您的CSV的列名,所以我猜是
'date\u file'
。这应该可以让您接近:

import pandas as pd

date_first = '2008-11-01'
date_last = '2008-11-10'

df = pd.read_csv("data.csv", chunksize=100000)

for chunk in df:
    chunk = chunk[(chunk['date_file'].str[:10] >= date_first)
                  & (chunk['date_file'].str[:10] <= date_last)]
    chunk.to_csv('output.csv', mode='a')
将熊猫作为pd导入
日期_first='2008-11-01'
最后日期='2008-11-10'
df=pd.read\u csv(“data.csv”,chunksize=100000)
对于df中的块:
chunk=chunk[(chunk['date\u file'].str[:10]>=date\u first)

&(chunk['date_file'].str[:10]嗨,roganjosh,很抱歉迟到了,谢谢你给我关于chunk参数的提示。事实上,我认为逐行阅读足以不使用chunk,我不知道append复制了整个数据,但只有这一行,尽管你说的时候看起来很明显。你粘贴的代码足以让我找到正确的方向。谢谢又来了。
import csv
import numpy
import pandas
from tqdm import tqdm

date_first = '2008-11-01'
date_last = '2008-11-10'
row = 0 #row index
a = pandas.DataFrame(numpy.zeros((0,35)))#data is 35 columns

with open("data.csv", "r") as f:
    for line in tqdm(f, unit = " lines per"):
        line = line.split(sep = ";")
        date_file = line[1][0:10]

        if  date_file>=date_first and date_file<=date_last :
            a.loc[row] = line #store the line in the pd.data.frame at the position row
            row = row + 1 #go to next row
import csv
import numpy
import pandas
from tqdm import tqdm

date_first = '2008-11-01'
date_last = '2008-11-10'
row = 0
index = list()

with open("data.csv", "r") as f:
    f = csv.reader(f, delimiter = ";")
    for line in tqdm(f, unit = " lines per"):
        line = line.split(sep = ";")
        date_file = line[1][0:10]
        row = row + 1
        if  date_file>=date_first and date_file<=date_last :
            index.append(row)

with open("data.csv") as f:
    reader=csv.reader(f)
    interestingrows=[row for idx, row in enumerate(reader) if idx in index]
import pandas as pd

date_first = '2008-11-01'
date_last = '2008-11-10'

df = pd.read_csv("data.csv", chunksize=100000)

for chunk in df:
    chunk = chunk[(chunk['date_file'].str[:10] >= date_first)
                  & (chunk['date_file'].str[:10] <= date_last)]
    chunk.to_csv('output.csv', mode='a')