我的以下代码正常运行,但速度太慢。我非常感谢您提供的任何帮助:
import gf
import csv
cic = gf.ct
cii = gf.cit
li = gf.lt
oc = "Output.csv"
with open(cic, "rb") as input1:
reader = csv.DictReader(cie,gf.ctih)
with open(oc,"wb") as outfile:
writer = csv.DictWriter(outfile,gf.ctoh)
writer.writerow(dict((h,h) for h in gf.ctoh))
next(reader)
for ci in reader:
row = {}
row["ci"] = ci["id"]
row["cyf"] = ci["yf"]
with open(cii,"rb") as ciif:
reader2 = csv.DictReader(ciif,gf.citih)
next(reader2)
with open(li, "rb") as lif:
reader3 = csv.DictReader(lif,gf.lih)
next(reader3)
for cii in reader2:
if ci["id"] == cii["id"]:
row["ci"] = cii["ca"]
for li in reader3:
if ci["id"] == li["en_id"]:
row["cc"] = li["c"]
writer.writerow(row)
我为阅读器中的每一行打开reader2和reader3的原因是因为阅读器对象迭代一次然后完成。但是必须有一种更有效的方法来做到这一点,我非常感谢您提供的任何帮助!
如果有帮助,这段代码背后的直觉如下:从输入文件1中,抓取两个单元格;查看输入文件2是否具有与输入文件1中相同的主键,如果是,则从输入文件2中获取一个单元并将其与另外两个保存的单元一起保存;查看输入文件3是否与输入文件1中的主键相同,如果是,则从inputfile3中获取一个单元并保存。然后输出这四个值。也就是说,我正在从规范化表中获取元数据,而我正在尝试对其进行非规范化。必须有一种在Python中非常有效地执行此操作的方法。当前代码的一个问题是,当我必须有一种更简单的方法来搜索读者对象中的给定ID时,我会遍历读者对象,直到找到相关的ID ...
答案 0 :(得分:1)
首先,如果这确实存在于关系数据库中,为什么不只是用一些精心设计的选择来进行大型连接?
如果我这样做,我会使用pandas.DataFrame并将3个表合并在一起,然后我将迭代每一行并使用合适的逻辑将生成的“join”ed数据集转换为单个最终结果。