我写了一个有效的脚本,但我猜不是最有效的。我需要做的是:
以下是我到目前为止编写的代码:
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
答案 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)
difflib非常有效:http://docs.python.org/library/difflib.html
答案 2 :(得分:0)
按您的唯一字段对数据进行排序,然后使用类似于合并排序合并步骤的比较过程: