2

我的以下代码可以正常工作,但速度太慢了。我将非常感谢您提供的任何帮助:

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)

我为 reader 中的每一行打开 reader2 和 reader3 的原因是因为 reader 对象迭代一次然后完成。但是必须有一种更有效的方法来做到这一点,我将非常感谢您提供的任何帮助!

如果有帮助,此代码背后的直觉如下:从输入文件 1 中,抓取两个单元格;查看输入文件 2 是否具有与输入文件 1 中相同的主键,如果是,则从输入文件 2 中抓取一个单元格并将其与其他两个已保存的单元格一起保存;查看输入文件 3 的主键是否与输入文件 1 中的主键相同,如果是,则从 inputfile3 中抓取一个单元格并保存。然后输出这四个值。也就是说,我正在从规范化表中获取元数据,并尝试对其进行非规范化。必须有一种方法可以在 Python 中非常有效地做到这一点。当前代码的一个问题是我遍历阅读器对象,直到找到相关的 ID,此时必须有一种更简单的方法来搜索阅读器对象中的给定 ID...

4

1 回答 1

1

一方面,如果这确实存在于关系数据库中,为什么不使用一些精心措辞的选择进行大连接呢?

如果我这样做,我将使用 pandas.DataFrame 并将 3 个表合并在一起,然后我将遍历每一行并使用合适的逻辑将生成的“连接”数据集转换为单个最终结果。

于 2013-10-02T20:59:02.290 回答