优化python文件比较脚本

优化python文件比较脚本,python,algorithm,optimization,csv,complexity-theory,Python,Algorithm,Optimization,Csv,Complexity Theory,我写了一个脚本,但我猜这不是最有效的。我需要做的是: 比较包含用户信息的两个csv文件。它本质上是一个成员列表,其中一个文件是另一个文件的更新版本 这些文件包含ID、名称、状态等数据 仅将新文件中旧文件中不存在的记录或包含更新信息的记录写入第三个csv文件。对于每个记录,都有一个唯一的ID,允许我确定记录是新的还是以前存在的 以下是我迄今为止编写的代码: import csv fileAin = open('old.csv','rb') fOld = csv.reader(fileAin)

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

  • 比较包含用户信息的两个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()
导入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=[]
新=[]
对于折叠中的行:
old.append(行)
对于fNew中的行:
新增。追加(行)
输出=[]
x=透镜(新)
i=0
num=0
而i
就功能而言,此脚本可以正常工作。然而,我正试图在包含数十万条记录的文件上运行此操作,并且需要几个小时才能完成。我猜问题在于将两个文件都读取到列表中,并将整行数据作为单个字符串进行比较

我的问题是,我想做的是,是否有一种更快、更有效的方法来处理这两个文件,以创建只包含新记录和更新记录的第三个文件?我并没有确定目标时间,只是想了解Python中是否有更好的方法来处理这些文件

提前感谢您的帮助

更新以包含数据的样本行:


123456789,34,DOE,JOHN,17647561234,缅因街,市,州,305,1,A

像这样的怎么样?代码的最大低效之处之一是每次都检查new[num]是否为old,因为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()

difflib非常有效:

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


旁白:既然您使用的是2.7,为什么不使用上下文管理器打开文件?这样,即使出现错误,它们也会关闭,而无需编写
try:。。。除了IOError:…
你们能给我们举一个数据行的例子吗?那个是因为我对Python还是很陌生的。我是出于工作需要才拿起它的。我需要做的很多事情都相当简单,只是需要重复多次。我不熟悉您提到的上下文管理器,但感谢您提供链接。我会去看看,了解更多。非常感谢。主帖子中包含的数据的样本行。第一个值是唯一的ID吗?这肯定会以难以置信的速度处理文件。但是,我的预期输出文件包含整个新的.csv文件。我将修改这个脚本,看看是否可以让它只写新的或更新的记录。谢谢你的启动。新旧的列数是否完全相同?我的代码就是这样假设的。是的,旧的和新的列数是相同的。使用我的示例行,我将查找如下内容:old:123456789,34,DOE,JOHN,17647561234 MAIN ST.,CITY,STATE,305,1,一个新的:123456789,32,DOE,JOHN,17647561234 MAIN ST.,CITY,STATE,305,1,A唯一更改的是在第二列中,其中的值从34更改为32。在这种情况下,我需要将该记录与任何全新记录一起复制到输出文件中;这不是成对比较元素,而是检查笛卡尔乘积。如果不是旧的[row\u id]==new[row\u id]:
可能就足够了。测试集合和dict中的成员身份非常快:它们使用哈希(这就是为什么集合中的成员和dict中的键需要可哈希的原因)。要想知道字典里是否有什么东西,你需要检查索引,然后查看页面。(非常粗略地)相比之下,要测试列表中的成员身份,您必须逐个阅读元素。对于不存在的元素,在通读它们之前,你不会知道它们不存在。