优化python文件比较脚本

时间:2012-03-29 19:37:53

标签: python algorithm optimization csv complexity-theory

我写了一个有效的脚本,但我猜不是最有效的。我需要做的是:

  • 比较两个包含用户信息的csv文件。它本质上是一个成员列表,其中一个文件是另一个文件的更新版本。
  • 文件包含ID,姓名,状态等数据等
  • 仅向新文件中的记录写入第三个csv文件,该文件在旧文件中不存在,或包含更新的信息。对于每条记录,都有一个唯一的ID,允许我确定记录是新的还是以前存在的。

以下是我到目前为止编写的代码:

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 个答案:

答案 0 :(得分:3)

这样的事情怎么样?您的代码最大的低效率之一是每次检查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()

答案 1 :(得分:0)

答案 2 :(得分:0)

按您的唯一字段对数据进行排序,然后使用类似于合并排序合并步骤的比较过程:

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