Estou tentando criar um dicionário a partir de um arquivo csv. A primeira coluna do arquivo csv contém chaves exclusivas e a segunda coluna contém valores. Cada linha do arquivo csv representa um par exclusivo de chave e valor no dicionário. Tentei usar as classes csv.DictReader
e csv.DictWriter
, mas só consegui descobrir como gerar um novo dicionário para cada linha. Eu quero um dicionário. Aqui está o código que estou tentando usar:
import csv
with open('coors.csv', mode='r') as infile:
reader = csv.reader(infile)
with open('coors_new.csv', mode='w') as outfile:
writer = csv.writer(outfile)
for rows in reader:
k = rows[0]
v = rows[1]
mydict = {k:v for k, v in rows}
print(mydict)
Quando executo o código acima, recebo um ValueError: too many values to unpack (expected 2)
. Como crio um dicionário a partir de um arquivo csv? Obrigado.
python
csv
dictionary
list-comprehension
drbunsen
fonte
fonte
Respostas:
Acredito que a sintaxe que você estava procurando é a seguinte:
Como alternativa, para python <= 2.7.1, você deseja:
fonte
Abra o arquivo chamando de abrir e, em seguida
csv.DictReader
.Você pode iterar nas linhas do objeto leitor de dict do arquivo csv iterando sobre input_file.
OU Para acessar apenas a primeira linha
ATUALIZAÇÃO Nas versões python 3+, esse código mudaria um pouco:
fonte
next(dictobj)
vez dasdictobj.next()
versões do Python 3+.fonte
for row in reader: k, v = row
se você pode simplesmente escreverfor k, v in reader
, por exemplo. E se você espera que esse leitor seja iterável, produzindo itens de dois elementos, basta passá-lo diretamente para determinar a conversão.d = dict(reader)
é muito mais curto e significativamente mais rápido em grandes conjuntos de dados.for row in reader
paradigma acima , ele pode ser mais prático (após um desenvolvimento a longo prazo). Concordo com você a curto prazo, mas cuidado com a otimização prematura.Isso não é elegante, mas uma solução de uma linha usando pandas.
Se você deseja especificar dtype para seu índice (ele não pode ser especificado em read_csv se você usar o argumento index_col devido a um erro ):
fonte
Você apenas precisa converter csv.reader em dict:
fonte
ValueError: dictionary update sequence element #2 has length 3; 2 is required
.filter
chamada commap(operator.itemgetter(slice(2)), ...)
, por isso só vai puxar os dois primeiros iterms, tornando-se:dict(map(operator.itemgetter(slice(2)), filter(None, csv.reader(f))))
. Se for o Python 2, certifique-se de fazerfrom future_builtins import map, filter
, para que eledict
leia diretamente um gerador, em vez de produzir várioslist
s temporários desnecessários primeiro).Você também pode usar numpy para isso.
fonte
Eu sugiro adicionar
if rows
caso haja uma linha vazia no final do arquivofonte
Solução de uma linha
fonte
Se você estiver bem com o uso do pacote numpy, poderá fazer algo como o seguinte:
fonte
Para arquivos csv simples, como os seguintes
Você pode convertê-lo em um dicionário Python usando apenas built-ins
Isso deve render o seguinte dicionário
Nota: Os dicionários Python possuem chaves exclusivas; portanto, se o seu arquivo csv duplicar,
ids
você deverá anexar cada linha a uma lista.fonte
set_default
: csv_dict.set_default (key, []). append ({key: valor para chave, valor em zip (cabeçalho, valores)})).append
comando foi muito útil. Acabei usando a mesma sintaxe em umarow.update
iteração e adição a umDictReader
objeto que foi criado a partir de um arquivo CSV.Você pode usar isso, é bem legal:
fonte
Muitas soluções foram publicadas e eu gostaria de contribuir com a minha, que funciona para um número diferente de colunas no arquivo CSV. Ele cria um dicionário com uma chave por coluna e o valor de cada chave é uma lista com os elementos dessa coluna.
fonte
com pandas, é muito mais fácil, por exemplo. supondo que você tenha os seguintes dados como CSV e vamos chamá-lo
test.txt
/test.csv
(você sabe que CSV é um tipo de arquivo de texto)agora usando pandas
para cada linha, seria
e é isso.
fonte
Tente usar um
defaultdict
eDictReader
.Retorna:
fonte