Saya mencoba membuat kamus dari file csv. Kolom pertama dari file csv berisi kunci unik dan kolom kedua berisi nilai. Setiap baris file csv mewakili kunci unik, pasangan nilai dalam kamus. Saya mencoba menggunakan csv.DictReader
dan csv.DictWriter
kelas, tetapi saya hanya bisa mengetahui cara membuat kamus baru untuk setiap baris. Saya ingin satu kamus. Berikut adalah kode yang saya coba gunakan:
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)
Ketika saya menjalankan kode di atas saya mendapatkan ValueError: too many values to unpack (expected 2)
. Bagaimana cara membuat satu kamus dari file csv? Terima kasih.
python
csv
dictionary
list-comprehension
drbunsen
sumber
sumber
Jawaban:
Saya percaya sintaks yang Anda cari adalah sebagai berikut:
Bergantian, untuk python <= 2.7.1, Anda ingin:
sumber
Buka file dengan memanggil open lalu
csv.DictReader
.Anda dapat mengulangi baris dari objek pembaca file csv dicter dengan mengulangi input_file.
ATAU Untuk mengakses saluran pertama saja
PEMBARUAN Dalam versi python 3+, kode ini akan berubah sedikit:
sumber
next(dictobj)
bukandictobj.next()
dalam versi Python 3+.sumber
for row in reader: k, v = row
jika Anda bisa menulisfor k, v in reader
, misalnya. Dan jika Anda berharap, pembaca itu adalah item dua elemen yang dapat diubah, maka Anda dapat meneruskannya langsung ke dikt untuk konversi.d = dict(reader)
jauh lebih pendek dan lebih cepat secara signifikan pada dataset besar.for row in reader
paradigma di atas , maka mungkin (setelah pengembangan jangka panjang) lebih praktis. Saya setuju dengan Anda jangka pendek, tetapi waspadalah terhadap pengoptimalan prematur.Ini tidak elegan tetapi solusi satu baris menggunakan panda.
Jika Anda ingin menentukan tipe untuk indeks Anda (itu tidak dapat ditentukan dalam read_csv jika Anda menggunakan argumen index_col karena suatu bug ):
sumber
Anda harus mengonversi csv.reader menjadi dict:
sumber
ValueError: dictionary update sequence element #2 has length 3; 2 is required
.filter
panggilan denganmap(operator.itemgetter(slice(2)), ...)
, sehingga hanya akan menarik dua iterms pertama, sehingga:dict(map(operator.itemgetter(slice(2)), filter(None, csv.reader(f))))
. Jika itu Python 2, pastikan untuk melakukannyafrom future_builtins import map, filter
, jadidict
membaca generator secara langsung, alih-alih menghasilkan beberapa sementara yang tidak perlulist
terlebih dahulu).Anda juga bisa menggunakan numpy untuk ini.
sumber
Saya sarankan menambahkan
if rows
kalau-kalau ada baris kosong di akhir filesumber
Solusi satu lapis
sumber
Jika Anda setuju dengan menggunakan paket numpy, maka Anda dapat melakukan sesuatu seperti berikut:
sumber
Untuk file csv sederhana, seperti berikut ini
Anda dapat mengonversinya ke kamus Python hanya menggunakan built-in
Ini harus menghasilkan kamus berikut
Catatan: Kamus python memiliki kunci unik, jadi jika file csv Anda memiliki duplikat
ids
Anda harus menambahkan setiap baris ke daftar.sumber
set_default
: csv_dict.set_default (key, []). append ({key: value for key, value in zip (header, values)})).append
perintah Anda sangat berguna. Saya akhirnya menggunakan sintaks yang sama dalamrow.update
it iterasi dan menambahkan keDictReader
objek yang dibuat dari file CSV.Anda dapat menggunakan ini, itu sangat keren:
sumber
Banyak solusi telah diposting dan saya ingin berkontribusi dengan saya, yang berfungsi untuk sejumlah kolom dalam file CSV. Itu menciptakan kamus dengan satu kunci per kolom, dan nilai untuk setiap kunci adalah daftar dengan unsur-unsur dalam kolom tersebut.
sumber
dengan panda, itu jauh lebih mudah, misalnya. dengan asumsi Anda memiliki data berikut sebagai CSV dan sebut saja
test.txt
/test.csv
(Anda tahu CSV adalah semacam file teks)sekarang menggunakan panda
untuk setiap baris, itu akan menjadi
dan hanya itu.
sumber
Coba gunakan a
defaultdict
danDictReader
.Ia mengembalikan:
sumber