尝试创建一个方法,在以下界面后面添加新行:
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
答案 0 :(得分:1)
尝试以下方法:
csvwriter.writerow(rowtoadd[x] for x in sorted(rowtoadd.keys()))
问题是双重的:
dict
对象。在python中不支持dict键的顺序。writerow(rowtoadd)
时,dict
中的默认迭代器超过了键,这就是你的csv文件获取键而不是值的原因。在上面的代码行中,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)
此解决方案依赖于调用者以正确的顺序提供参数的事实。