Соответствие строки в двух файлах CSV, но второй файл слишком велик для чтения в списке - PullRequest
1 голос
/ 09 мая 2020

Следующий код работает для файлов размером до 3 миллионов записей, но больше, чем это, у меня заканчивается память, потому что я читаю данные в списки, а затем использую списки для l oop и нахожу совпадения.

Из предыдущих сообщений я понял, что я должен обрабатывать каждую строку за раз через l oop, но не могу найти никаких сообщений о том, как взять строку за раз из файла CSV и обработать ее через два цикла итераций, как в моем коде ниже.

Любая помощь будет принята с благодарностью. Заранее благодарим вас.

import csv

# open two csv files and read into lists lsts and lstl
with open('small.csv') as s:
    sml = csv.reader(s)
    lsts = [tuple(row) for row in sml]

with open('large.csv') as l:
    lrg = csv.reader(l)
    lstl = [tuple(row) for row in lrg] # can be two large for memory

# find a match and print 
for rows in lsts:
    for rowl in lstl:

        if rowl[7] != rows[0]: # if no match continue
            continue
        else: 
            print(rowl[7], rowl[2]) # when matched print data required from large file

1 Ответ

1 голос
/ 09 мая 2020

Предполагая, что вас интересует только один столбец небольшого csv, вы можете превратить его в набор и сравнивать построчно с большим csv. Сравнение наборов заменяет внешний l oop полностью

import csv

with open('small.csv') as s:
    sml = csv.reader(s)
    sml_set = set(row[0] for row in sml)

with open('large.csv') as l:
    lrg = csv.reader(l)
    for row in lrg:
        if row[7] in sml_set:
            print(rowl[7], rowl[2])

Вы можете превратить это в генератор, например

def row_matches():
    with open('small.csv') as s:
        sml = csv.reader(s)
        sml_set = set(row[0] for row in sml)

    with open('large.csv') as l:
        lrg = csv.reader(l)
        for row in lrg:
            if row[7] in sml_set:
                yield rowl[7], rowl[2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...