Estoy tratando de crear un diccionario a partir de un archivo csv. La primera columna del archivo csv contiene claves únicas y la segunda columna contiene valores. Cada fila del archivo csv representa una clave única, un par de valores dentro del diccionario. Traté de usar las clases csv.DictReader
y csv.DictWriter
, pero solo pude descubrir cómo generar un nuevo diccionario para cada fila. Quiero un diccionario Aquí está el código que estoy tratando de 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)
Cuando ejecuto el código anterior, obtengo un ValueError: too many values to unpack (expected 2)
. ¿Cómo creo un diccionario a partir de un archivo csv? Gracias.
python
csv
dictionary
list-comprehension
drbunsen
fuente
fuente
Respuestas:
Creo que la sintaxis que buscabas es la siguiente:
Alternativamente, para python <= 2.7.1, desea:
fuente
Abra el archivo llamando a abrir y luego
csv.DictReader
.Puede iterar sobre las filas del objeto lector de archivos csv dictando iterando sobre input_file.
O Para acceder solo a la primera línea
ACTUALIZACIÓN En las versiones de Python 3+, este código cambiaría un poco:
fuente
next(dictobj)
lugar dedictobj.next()
en las versiones Python 3+.fuente
for row in reader: k, v = row
si simplemente puede escribirfor k, v in reader
, por ejemplo. Y si espera que ese lector sea iterable y produzca elementos de dos elementos, simplemente puede pasarlo directamente a dict para conversión.d = dict(reader)
es mucho más corto y significativamente más rápido en grandes conjuntos de datos.for row in reader
paradigma anterior , entonces podría (después del desarrollo a largo plazo) ser más práctico. Estoy de acuerdo con usted a corto plazo, pero tenga cuidado con la optimización prematura.Esto no es elegante, sino una solución de una línea que utiliza pandas.
Si desea especificar dtype para su índice (no se puede especificar en read_csv si usa el argumento index_col debido a un error ):
fuente
Solo tienes que convertir csv.reader a dict:
fuente
ValueError: dictionary update sequence element #2 has length 3; 2 is required
.filter
llamada conmap(operator.itemgetter(slice(2)), ...)
, por lo que sólo se tire de los dos primeros iterms, por lo que es:dict(map(operator.itemgetter(slice(2)), filter(None, csv.reader(f))))
. Si se trata de Python 2, asegúrese de hacerlofrom future_builtins import map, filter
, de modo quedict
lea un generador directamente, en lugar de producir varioslist
s temporales innecesarios primero).También puedes usar numpy para esto.
fuente
Sugeriría agregar
if rows
en caso de que haya una línea vacía al final del archivofuente
Solución de una línea
fuente
Si está de acuerdo con el uso del paquete numpy, puede hacer algo como lo siguiente:
fuente
Para archivos csv simples, como los siguientes
Puede convertirlo en un diccionario de Python utilizando solo elementos integrados.
Esto debería producir el siguiente diccionario
Nota: Los diccionarios de Python tienen claves únicas, por lo que si su archivo csv tiene duplicados
ids
, debe agregar cada fila a una lista.fuente
set_default
Nota: todo esto se puede acortar para usar : csv_dict.set_default (key, []). append ({key: value for key, value in zip (header, values)})).append
comando fue muy útil. Terminé usando la misma sintaxis en unrow.update
al iterar y agregar a unDictReader
objeto que se hizo a partir de un archivo CSV.Puedes usar esto, es genial:
fuente
Se han publicado muchas soluciones y me gustaría contribuir con la mía, que funciona para un número diferente de columnas en el archivo CSV. Crea un diccionario con una clave por columna, y el valor de cada clave es una lista con los elementos en dicha columna.
fuente
con pandas, es mucho más fácil, por ejemplo. asumiendo que tiene los siguientes datos como CSV y llamémoslo
test.txt
/test.csv
(usted sabe que CSV es una especie de archivo de texto)ahora usando pandas
para cada fila, sería
y eso es.
fuente
Trate de usar una
defaultdict
yDictReader
.Vuelve:
fuente