Eu tenho uma lista de dicionários que se parece com isso:
toCSV = [{'name':'bob','age':25,'weight':200},{'name':'jim','age':31,'weight':180}]
O que devo fazer para converter isso em um arquivo csv parecido com este:
name,age,weight
bob,25,200
jim,31,180
python
csv
dictionary
data-conversion
backus
fonte
fonte
Respostas:
EDIT: Minha solução anterior não lida com o pedido. Conforme observado por Wilduck, o DictWriter é mais apropriado aqui.
fonte
with open('people.csv', 'wb') as f: ...
dict_writer.writeheader()
vez dedict_writer.writer.writerow(keys)
open('people.csv', 'w')
set().union(*(d.keys() for d in mylist))
para obter todas as chaves na lista (se você tem algum que não tem todas as chaves.)é quando você tem uma lista de dicionários:
fonte
No python 3, as coisas são um pouco diferentes, mas muito mais simples e menos propensas a erros. É uma boa idéia informar ao CSV que seu arquivo deve ser aberto com
utf8
codificação, pois torna esses dados mais portáteis para outras pessoas (supondo que você não esteja usando uma codificação mais restritiva, comolatin1
)csv
no python 3 precisa donewline=''
parâmetro, caso contrário, você obtém linhas em branco no seu CSV ao abrir no excel / opencalc.Como alternativa: prefiro usar o manipulador csv no
pandas
módulo. Acho que é mais tolerante a problemas de codificação, e os pandas convertem automaticamente os números de string em CSVs no tipo correto (int, float, etc.) ao carregar o arquivo.Nota:
utf8
python3, além de descobrir os cabeçalhos.dataframe.to_dict('records')
csv
módulo vanilla , você precisa alimentá-loOrderedDict
ou eles aparecerão em uma ordem aleatória (se estiver trabalhando em python <3.5). Consulte: Preservando a ordem das colunas no Python Pandas DataFrame para obter mais informações.fonte
Como o @User e o @BiXiC pediram ajuda com o UTF-8 aqui uma variação da solução do @Matthew. (Não tenho permissão para comentar, por isso estou respondendo.)
fonte
Essa seria a maneira mais simples de gravar dados no arquivo .csv
fonte
Aqui está outra solução mais geral, supondo que você não tenha uma lista de linhas (talvez elas não se encaixem na memória) ou uma cópia dos cabeçalhos (talvez a
write_csv
função seja genérica):Nota : o construtor OrderedDict usado aqui preserva apenas a ordem em python> 3.4. Se a ordem for importante, use o
OrderedDict([('name', 'bob'),('age',25)])
formulário.fonte
fonte