Csv.DictReader читается только в определенных строках

Есть ли способ читать определенные строки файла .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 миллионов строк, а любые дальнейшие условия или обработка в цикле просто значительно замедлит его.

Поэтому было бы разумно перебирать группы строк, а затем многопоточно, чтобы сэкономить время.

Вещи, которые я рассмотрел:

  • Используя процедуру чтения csv pandas (вам все еще нужно загрузить в весь набор данных в начале)
  • Итерации по строкам, как в моем примере код, регистрируя количество строк, а затем перезагружая строки в многопоточном партии.
  • Использование генератора, а не итератора (например, см. ThreadPool и Pool для параллельной обработки)

Спасибо заранее!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
1 295
1

Ответы 1

Вы можете использовать enumerate для генерации индексов строк, а break - цикл, когда индекс достигает вашей цели:

IDs = set()
for i, row in enumerate(reader):
    if i > 9:
        IDs.add(row['A'])
    elif i > 19:
        break

Обратите внимание, что вы можете сделать IDs набором вместо списка для гораздо большей эффективности при получении уникальных идентификаторов.

Спасибо за ответ! Я предполагаю, что этот метод по-прежнему выполняет итерацию по нижним строкам, чтобы перейти к нужному диапазону строк? Я вижу, что это проблема, когда нужно перебирать 90% набора данных до достижения последних, скажем, 10 строк, если это имеет смысл

user8188120 16.11.2018 16:35

Кстати, я реализовал вашу идею использования набора вместо добавления в список - спасибо!

user8188120 16.11.2018 16:45

Рад помочь. Да, чтение нижних строк является обязательным, потому что нет другого способа подсчитать количество строк, каждая из которых заканчивается символом новой строки, без фактического чтения каждого символа. То, что я вам показываю, по крайней мере, по-прежнему поможет, когда ваша целевая строка находится ближе к началу файла.

blhsing 16.11.2018 16:52

В этом есть смысл ... Я полагаю, это означает, что нет другого пути: 1. Итерация по набору данных строка за строкой, но не сохранение в памяти, или 2. Загрузка всего набора данных, а затем выбор строк из памяти.

user8188120 16.11.2018 16:56

Правильно. Хотя вариант 1, безусловно, предпочтительнее.

blhsing 16.11.2018 17:00

Другие вопросы по теме