Форматирование строки CSV из словаря - PullRequest
0 голосов
/ 28 мая 2019

Я пишу добавление новых словарных статей в 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

, чтобы 1559052353 были в А1, покупать в А2 и 8110 в А3, например

Я пробовал '' .join (split (',')) для каждой строки в csv, но получаю сообщение об ошибке. Большое спасибо, если вы можете помочь!

Ответы [ 3 ]

1 голос
/ 28 мая 2019

с вашим кодом вы получаете заголовок, равный 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 в заголовке чем-то другим

0 голосов
/ 28 мая 2019

Вы, вероятно, хотели написать: writer.writerow(log.example[unix]). это будет делать то, что вы хотите. вам также не нужно использовать e.close(), так как блок with автоматически закрывает файл для вас.

0 голосов
/ 28 мая 2019

Проверьте параметр диалектов в csv.dictwriter, это позволяет вам устанавливать различные соглашения для вашего CSV, я думаю, вы хотите QUOTE_MINIMAL.

Кроме того, вы пишете ключ и список своему диктору. Как правило, диктатор берет словарь в каждой строке, причем каждое поле помещается в словаре как пара «имя поля»: значение поля.

Попробуйте преобразовать вашу программу вывода так, чтобы она передавала отдельные словари строк, например:

log.example[unix] = {"unix":unix, "x":x, "price":price}

{"unix" : 1559052353, "x" : 'buy', "price" : 8110}

Диктофонер выведет строку с 3 полями: "unix", "x", "price" в соответствии с предпочитаемым вами диалектом csv.

В существующем состоянии вы даете ему список ключей, поэтому он выводит этот список «сырым», что означает, что он применяет эти нежелательные дополнительные декорации "[", "]"

...