2016-09-26 83 views
0

试图让添加新行的方法波纹管的界面如下:Python3 - CSV - 添加行与namedtuple

def row_add(self, **rowtoadd) 

我不知道怎么样,如果我定义喜欢我列:

stuff1, stuff2, stuff3 

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

到目前为止,我已经试过(这里表=我们正在编辑的文件路径,包含我们需要的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

尝试以下操作:

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

的问题是双重的:

  1. 'rowtoadd' 是dict对象。一个字典的键的顺序是不支持在Python中。
  2. 当你writerow(rowtoadd),在dict默认迭代器是关键,这就是为什么你的csv文件获取键而不是值。

以我线的上面的代码,sorted(rowtoadd.keys())排序字典的键,使得它们在可预知的顺序(按字母顺序)。 rowtoadd[x] for x in ...使它成为一种理解,它提供了您想要打印到文件中的值的有序列表。

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

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

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) 

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