Есть ли способ читать определенные строки файла .csv при использовании функции csv.DictReader в Python?
Например, если вы хотите сначала загрузить только 10–20 строки файла .csv, без загрузки всего набора данных.
У меня есть несколько файлов .csv с 200 миллионами строк в каждом, содержащих 10 записей данных field_name - поэтому я использую DictReader, а не простой csv.read ().
Вот простой пример моего текущего метода:
import csv
from tqdm import tqdm
field_names = ['A','B','C']
IDs = []
with open(file_1) as f:
reader = csv.DictReader(f,field_names,delimiter=',')
row_count = 0
for row in tqdm(reader):
row_count+=1
ID = row['A']
if ID not in IDs == True:
IDs.append(ID)
Вы можете понять, почему это будет медленным для перебора 200 миллионов строк, а любые дальнейшие условия или обработка в цикле просто значительно замедлит его.
Поэтому было бы разумно перебирать группы строк, а затем многопоточно, чтобы сэкономить время.
Вещи, которые я рассмотрел:
Спасибо заранее!






Вы можете использовать enumerate для генерации индексов строк, а break - цикл, когда индекс достигает вашей цели:
IDs = set()
for i, row in enumerate(reader):
if i > 9:
IDs.add(row['A'])
elif i > 19:
break
Обратите внимание, что вы можете сделать IDs набором вместо списка для гораздо большей эффективности при получении уникальных идентификаторов.
Кстати, я реализовал вашу идею использования набора вместо добавления в список - спасибо!
Рад помочь. Да, чтение нижних строк является обязательным, потому что нет другого способа подсчитать количество строк, каждая из которых заканчивается символом новой строки, без фактического чтения каждого символа. То, что я вам показываю, по крайней мере, по-прежнему поможет, когда ваша целевая строка находится ближе к началу файла.
В этом есть смысл ... Я полагаю, это означает, что нет другого пути: 1. Итерация по набору данных строка за строкой, но не сохранение в памяти, или 2. Загрузка всего набора данных, а затем выбор строк из памяти.
Правильно. Хотя вариант 1, безусловно, предпочтительнее.
Спасибо за ответ! Я предполагаю, что этот метод по-прежнему выполняет итерацию по нижним строкам, чтобы перейти к нужному диапазону строк? Я вижу, что это проблема, когда нужно перебирать 90% набора данных до достижения последних, скажем, 10 строк, если это имеет смысл