我正在编写将新字典条目添加到csv的过程中。这完全可以正常工作,但是格式很时髦。我正在记录我的自动化策略进行的交易。它记录时间戳记,交易和价格。
这是我的函数,它记录一个新的词典条目并追加到我的csv中:
def record_example(x):
now = datetime.now()
unix = int(mktime(now.timetuple()))
price = 8110
log.example[unix] = [unix, x, price]
with open('example.csv', 'a') as e:
writer = csv.DictWriter(e, fieldnames=log.example)
writer.writerow(log.example)
e.close()
我调用带有w ::
的函数record('buy')
这将创建应有的字典:
{1559052353: [1559052353, 'buy', 8110]}
不过现在进入csv的方式看起来就像只填充A1:
"[1559052353, 'buy', 8110]"
当我试图将其显示为:(以便可以将csv导入另一个.py文件并绘制交易性能时)
1559052353, buy, 8110
例如,在A1中有1559052353,在A2中有购买,在A3中有8110。
我在csv中为每行尝试了''.join(split(','),但仍收到错误消息。.非常感谢您的帮助!
答案 0 :(得分:1)
使用您的代码,您将标头设为1559052353
,并且值是整个列表(转换为str,这就是为什么您还会获得双引号的原因)
我相信您希望使用字段名unix,x,price
和值1559052353,buy,8110
with open('example.csv', 'a') as e:
header = ['unix', 'x', 'price']
writer = csv.DictWriter(e, fieldnames=header)
writer.writeheader()
writer.writerow(dict(zip(header, log.example[unix])))
请注意,在使用with
上下文管理器时,您无需调用e.close()
您可能希望将log.example[unix]
用作字典,而不是列表。
另外,也许用其他东西替换标头中的x
答案 1 :(得分:0)
在csv.dictwriter
中检查方言选项,这使您可以为csv设置不同的约定,我想是您想要QUOTE_MINIMAL
。
此外,您正在写出一把钥匙,以及一份写给独裁者的清单。通常,字典作者将每行使用一个字典,每个字段作为“ fieldname”:fieldvalue对存放在字典中。
尝试转换输出例程,以便它传递单个行字典,例如:
log.example[unix] = {"unix":unix, "x":x, "price":price}
{"unix" : 1559052353, "x" : 'buy', "price" : 8110}
dictwriter将根据您喜欢的csv方言输出带有3个字段的行,即“ unix”,“ x”,“ price”。
按现状,您将为其提供键列表,因此它将输出“原始”列表,这意味着它将应用那些不需要的多余修饰“ [”,“]”
答案 2 :(得分:0)
您可能想写:writer.writerow(log.example[unix])
。这会做你想要的事情。您也不需要使用e.close()
,因为with
块会自动为您关闭文件。