csv.DictReader только для чтения в определенных строках - PullRequest
0 голосов
/ 16 ноября 2018

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

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

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

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

Заранее большое спасибо!

1 Ответ

0 голосов
/ 16 ноября 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...