如何使用Python脚本从巨大的CSV文件中过滤特定行

时间:2016-03-21 13:25:16

标签: python

python中是否有一种有效的方法可以将巨大的 csv文件中的特定行加载到内存中(进一步处理)而不会增加内存负担?
例如:假设我想按照以下格式从文件中过滤特定日期的行,并且让我们说这个文件是数十或数百个演出(日期不是有序的)

Date         event_type    country
2015/03/01   impression    US
2015/03/01   impression    US
2015/03/01   impression    CA
2015/03/01   click         CA
2015/03/02   impression    FR
2015/03/02   click         FR
2015/03/02   impression    US
2015/03/02   click         US

3 个答案:

答案 0 :(得分:0)

您仍然需要处理文件中的每一行以检查您的子句。但是,不必将所有文件加载到内存中,因此您可以按如下方式使用流:

import csv
with open('huge.csv', 'rb') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=' ', quotechar='"')
    for row in spamreader:
        if row[0] == '2015/03/01':
            continue

        # Process data here

如果您只需要一个匹配行列表,那么使用列表理解会更快,更简单,如下所示:

import csv
with open('huge.csv', 'rb') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=' ', quotechar='"')
    rows = [row for row in spamreader if row[0] == '2015/03/01']

答案 1 :(得分:0)

如果日期可以出现在任何地方,则必须解析整个文件:

import csv

def get_rows(k, fle):
    with open(fle) as f:
        next(f)
        for row in csv.reader(f, delimiter=" ", skipinitialspace=1):
            if row[0] == k:
                yield row


for row in get_rows("2015/03/02", "in.txt"):
    print(row)

您可以使用多处理来加速解析将数据拆分为块。有一些想法here

答案 2 :(得分:0)

import csv

filter_countries = {'US': 1}
with open('data.tsv', 'r') as f_name:
    for line in csv.DictReader(f_name, delimiter='\t'):
        if line['country'] not in filter_countries:
            print(line)