Python3 - CSV - 使用namedtuple添加行

时间:2016-09-26 15:11:43

标签: python-3.x csv

尝试创建一个方法,在以下界面后面添加新行:

def row_add(self, **rowtoadd)

如果我将列定义为:

,我不知道如何
stuff1, stuff2, stuff3

我可以得到一个** namedtuple来按照列名的正确顺序排序。

到目前为止,我已经尝试了(这里是table =我们正在编辑的文件路径,包含我们需要的csv):

def row_add(self, **rowtoadd):
  if os.path.isfile(self.table):
     with open(self.table, 'a') as csvfile:
        csvwriter = csv.writer(csvfile)
        csvwriter.writerow(rowtoadd)

但是,namedtuple没有被转换成一行,只有变量的名称是。 例如:

row_add(stuff1="hello1", stuff2="hello2", stuff3="hello3")
cat ./my_file.csv -> stuff1, stuff2, stuff3

1 个答案:

答案 0 :(得分:1)

尝试以下方法:

csvwriter.writerow(rowtoadd[x] for x in sorted(rowtoadd.keys()))

问题是双重的:

  1. ' rowtoadd'是dict对象。在python中不支持dict键的顺序。
  2. 当你writerow(rowtoadd)时,dict中的默认迭代器超过了键,这就是你的csv文件获取键而不是值的原因。
  3. 在上面的代码行中,sorted(rowtoadd.keys())对dict的键进行排序,使它们处于可预测的顺序(按字母顺序排列)。 rowtoadd[x] for x in ...使其成为一种理解,它提供了您要打印到文件中的值的有序列表。

    这里要理解的关键是csvwriter不知道文件预先存在的结构。它不知道密钥的顺序。您需要以某种方式指定该顺序。在这种情况下,我按字母顺序指定了顺序,但您可能需要采用不同的方式。

    如果您事先不知道字段的名称,则可以使用位置参数来保持字段的顺序。位置参数变为tuple,它是python中的有序类型:

    def row_add(self, *row):
      if os.path.isfile(self.table):
         with open(self.table, 'a') as csvfile:
            csvwriter = csv.writer(csvfile)
            csvwriter.writerow(row)
    

    此解决方案依赖于调用者以正确的顺序提供参数的事实。