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
答案 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)