Python3 - CSV - 添加行与namedtuple
问题描述:
试图让添加新行的方法波纹管的界面如下: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
答
尝试以下操作:
csvwriter.writerow(rowtoadd[x] for x in sorted(rowtoadd.keys()))
的问题是双重的:
- 'rowtoadd' 是
dict
对象。一个字典的键的顺序是不支持在Python中。 - 当你
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)
该解决方案依赖于调用者提供正确的顺序参数的事实。