Оптимизировать скрипт сравнения файлов python - PullRequest
1 голос
/ 29 марта 2012

Я написал скрипт, который работает, но, думаю, не самый эффективный.Что мне нужно сделать, это следующее:

  • Сравните два файла CSV, которые содержат информацию о пользователе.По сути, это список участников, в котором один файл является более обновленной версией другого.
  • Файлы содержат такие данные, как идентификатор, имя, состояние и т. Д. И т.ТОЛЬКО записи в новом файле, которые либо не существуют в старом файле, либо содержат обновленную информацию.Для каждой записи есть уникальный идентификатор, который позволяет мне определить, является ли запись новой или существовала ранее.

Вот код, который я написал до сих пор:

import csv

fileAin = open('old.csv','rb')
fOld = csv.reader(fileAin)

fileBin = open('new.csv','rb')
fNew = csv.reader(fileBin)

fileCout = open('NewAndUpdated.csv','wb')
fNewUpdate = csv.writer(fileCout)

old = []
new = []

for row in fOld:
    old.append(row)
for row in fNew:
    new.append(row)

output = []

x = len(new)
i = 0
num = 0

while i < x:
    if new[num] not in old:
        fNewUpdate.writerow(new[num])

    num += 1
    i += 1

fileAin.close()
fileBin.close()
fileCout.close()

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

Мой вопрос в том, что я пытаюсь сделать, это более быстрый, более эффективный способ обработки двух файлов для создания третьего файла, содержащего только новые и обновленные записи?У меня нет целевого времени, я просто хочу понять, есть ли в Python более эффективные способы обработки этих файлов.

Заранее благодарен за любую помощь.

ОБНОВЛЕНИЕ, чтобы включить примерстрока данных:

123456789,34, DOE, JOHN, 1764756,1234 MAIN ST., CITY, STATE, 305,1, A

Ответы [ 3 ]

3 голосов
/ 30 марта 2012

Как насчет этого?Одной из самых больших неэффективностей вашего кода является проверка того, является ли new [num] старым каждый раз, потому что old является списком, поэтому вам придется перебирать весь список.Использование словаря намного быстрее.

import csv

fileAin = open('old.csv','rb')
fOld = csv.reader(fileAin)

fileBin = open('new.csv','rb')
fNew = csv.reader(fileBin)

fileCout = open('NewAndUpdated.csv','wb')
fNewUpdate = csv.writer(fileCout)

old = {row[0]:row[1:] for row in fOld}
new = {row[0]:row[1:] for row in fNew}
fileAin.close()
fileBin.close()

output = {}

for row_id in new:
    if row_id not in old or not old[row_id] == new[row_id]:
        output[row_id] = new[row_id]

for row_id in output:
    fNewUpdate.writerow([row_id] + output[row_id])


fileCout.close()
0 голосов
/ 25 апреля 2012

Сортируйте данные по уникальным полям, а затем используйте процесс сравнения, аналогичный этапу объединения сортировки слиянием:

http://en.wikipedia.org/wiki/Merge_sort

0 голосов
/ 30 марта 2012

difflib довольно эффективен: http://docs.python.org/library/difflib.html

...