格式化由字典制成的csv行

时间:2019-05-28 14:10:09

标签: python csv dictionary export-to-csv

我正在编写将新字典条目添加到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(','),但仍收到错误消息。.非常感谢您的帮助!

3 个答案:

答案 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块会自动为您关闭文件。