Edit:
Em 2.7 / 3.2, há um novo writeheader()
método . Além disso, a resposta de John Machin fornece um método mais simples de escrever a linha do cabeçalho.
Exemplo simples de uso do writeheader()
método agora disponível em 2.7 / 3.2:
from collections import OrderedDict
ordered_fieldnames = OrderedDict([('field1',None),('field2',None)])
with open(outfile,'wb') as fou:
dw = csv.DictWriter(fou, delimiter='\t', fieldnames=ordered_fieldnames)
dw.writeheader()
# continue on to write data
Instanciar DictWriter requer um argumento fieldnames.
Da documentação :
O parâmetro fieldnames identifica a ordem em que os valores no dicionário passados para o método writerow () são gravados no csvfile.
Colocado de outra forma: o argumento Fieldnames é necessário porque os dictos do Python são inerentemente desordenados.
Abaixo está um exemplo de como você gravaria o cabeçalho e os dados em um arquivo.
Nota: with
declaração foi adicionada em 2.6. Se estiver usando 2,5:from __future__ import with_statement
with open(infile,'rb') as fin:
dr = csv.DictReader(fin, delimiter='\t')
# dr.fieldnames contains values from first row of `f`.
with open(outfile,'wb') as fou:
dw = csv.DictWriter(fou, delimiter='\t', fieldnames=dr.fieldnames)
headers = {}
for n in dw.fieldnames:
headers[n] = n
dw.writerow(headers)
for row in dr:
dw.writerow(row)
Como @FM menciona em um comentário, você pode condensar a escrita do cabeçalho em uma linha, por exemplo:
with open(outfile,'wb') as fou:
dw = csv.DictWriter(fou, delimiter='\t', fieldnames=dr.fieldnames)
dw.writerow(dict((fn,fn) for fn in dr.fieldnames))
for row in dr:
dw.writerow(row)
dw.writerow( dict((f,f) for f in dr.fieldnames) )
.dw = csv.DictWriter(fou, delimiter='\t', fieldnames=dr.fieldnames)
. Dessa forma, se seus campos mudarem, você não precisará ajustar o dictWriter.Algumas opções:
(1) Laboriosamente, faça um ditado de mapeamento de identidade (ou seja, não faça nada) de seus nomes de campo para que csv.DictWriter possa convertê-lo de volta em uma lista e passá-lo para uma instância csv.writer.
(2) A documentação menciona "a
writer
instância subjacente " ... então apenas use-a (exemplo no final).(3) Evite a sobrecarga csv.Dictwriter e faça você mesmo com csv.writer
Gravando dados:
ou
Em vez da
extrasaction
"funcionalidade", prefiro codificá-lo sozinho; dessa forma, você pode relatar TODOS os "extras" com as chaves e valores, não apenas a primeira chave extra. O que é realmente um incômodo com DictWriter é que se você verificou as chaves à medida que cada dicionário estava sendo construído, você precisa se lembrar de usar extrasaction = 'ignore', caso contrário, LENTAMENTE (nomes de campo é uma lista) repetir a verificação:============
fonte
extrasaction
funcionalidade parece ser implementada melhor. Agora estáwrong_fields = rowdict.keys() - self.fieldnames so it's effectively a
definida a operação.Outra maneira de fazer isso seria adicionar antes de adicionar linhas em sua saída, a seguinte linha:
O zip retornaria uma lista de dupleto contendo o mesmo valor. Esta lista pode ser usada para iniciar um dicionário.
fonte