Eu tenho um dicionário:
mydict = {key1: value_a, key2: value_b, key3: value_c}
Quero gravar os dados em um arquivo dict.csv, neste estilo:
key1: value_a
key2: value_b
key3: value_c
Eu escrevi:
import csv
f = open('dict.csv','wb')
w = csv.DictWriter(f,mydict.keys())
w.writerow(mydict)
f.close()
Mas agora tenho todas as chaves em uma linha e todos os valores na próxima linha.
Quando consigo escrever um arquivo como este, também quero lê-lo em um novo dicionário.
Apenas para explicar meu código, o dicionário contém valores e bools de textctrls e caixas de seleção (usando wxpython). Desejo adicionar os botões "Salvar configurações" e "Carregar configurações". Salvar configurações deve gravar o dicionário no arquivo da maneira mencionada (para tornar mais fácil para o usuário editar o arquivo csv diretamente), carregar as configurações deve ler do arquivo e atualizar os textctrls e caixas de seleção.
fonte
key1, value_a [linebreak] key2, value_b [linebreak] key3, value_c
?repr()
para escrever o ditado e, em seguida, avaliar a string ao lê-lo. Veja este post antigo do SO para ver as discussões sobre ostr()
versorepr()
e os documentos também.ConfigParser
móduloRespostas:
O
DictWriter
não funciona da maneira que você espera.Para ler de volta:
que é bastante compacto, mas assume que você não precisa fazer nenhuma conversão de tipo ao ler
fonte
delimiter=':'
ao criar o escritor e o leitor :)with
seria melhor. Vou mudar os exemplos para refletir isso ...\n
, receberá\n
o arquivo). Se deixado sozinho, o "modo universal" entra em ação e as novas linhas são traduzidas para o padrão do sistema operacional atual. Dado que não é realmente útil aqui (exceto se você quiser ter novas linhas previsíveis), vou removê-lo.Apenas para dar uma opção, escrever um dicionário em um arquivo csv também pode ser feito com o pacote pandas. Com o exemplo fornecido, poderia ser algo assim:
mydict = {'key1': 'a', 'key2': 'b', 'key3': 'c'}
A principal coisa a levar em consideração é definir o parâmetro 'orient' como 'index' dentro do método from_dict . Isso permite que você escolha se deseja escrever cada chave do dicionário em uma nova linha.
Além disso, dentro do método to_csv , o parâmetro header é definido como False apenas para ter apenas os elementos de dicionário sem linhas irritantes. Você sempre pode definir nomes de coluna e índice dentro do método to_csv.
Sua saída ficaria assim:
Se ao invés disso você quiser que as chaves sejam os nomes das colunas, apenas use o parâmetro padrão 'orientar' que é 'colunas', como você pode verificar nos links da documentação.
fonte
A maneira mais fácil é ignorar o módulo csv e formatá-lo você mesmo.
fonte
key
receber uma vírgula, você vai se divertir muito.csv.writer(...).writerows(my_dict.items())
. Ocsv
módulo faz muito mais do que apenas adicionar vírgulas e novas linhas.fonte
Você pode apenas fazer:
Para que você possa ter
key_1: value_1, key_2: value_2
fonte
','.join("%s:%s" % (k,v) for k,v in mydict.items())
- geralmente é melhor iterar sobre os itens de um dicionário, que fornece chaves e valores juntos, do que sobre as chaves de um dicionário e fazer pesquisas de 'n' valor.','.join(...)
toma o cuidado de colocar apenas vírgulas entre os valores, sem adicionar a vírgula final extra.Eu pessoalmente sempre achei o módulo csv um tanto chato. Espero que outra pessoa mostre como fazer isso habilmente com ele, mas minha solução rápida e suja é:
No entanto, se você quiser ler de volta, você precisará fazer algumas análises irritantes, especialmente se estiver tudo em uma linha. Aqui está um exemplo usando seu formato de arquivo proposto.
fonte
fonte
fonte
Você tentou adicionar o "s" em:
w.writerow(mydict)
assimw.writerows(mydict)
:? Esse problema aconteceu comigo, mas com listas, eu estava usando o singular em vez do plural.fonte