Saya punya kamus:
mydict = {key1: value_a, key2: value_b, key3: value_c}
Saya ingin menulis data ke file dict.csv, dengan gaya ini:
key1: value_a
key2: value_b
key3: value_c
Saya menulis:
import csv
f = open('dict.csv','wb')
w = csv.DictWriter(f,mydict.keys())
w.writerow(mydict)
f.close()
Tapi sekarang saya memiliki semua kunci dalam satu baris dan semua nilai di baris berikutnya ..
Ketika saya berhasil menulis file seperti ini, saya juga ingin membacanya kembali ke kamus baru.
Hanya untuk menjelaskan kode saya, kamus berisi nilai dan nilai dari textctrls dan kotak centang (menggunakan wxpython). Saya ingin menambahkan tombol "Simpan setelan" dan "Muat setelan". Pengaturan penyimpanan harus menulis kamus ke file dengan cara yang disebutkan (untuk memudahkan pengguna mengedit file csv secara langsung), pengaturan beban harus membaca dari file dan memperbarui textctrls dan kotak centang.
python
csv
dictionary
pengguna1106770
sumber
sumber
key1, value_a [linebreak] key2, value_b [linebreak] key3, value_c
?repr()
untuk menulis dict dan kemudian mengevaluasi string tersebut ketika Anda membacanya. Lihatlah posting SO lama ini untuk diskusi tentangstr()
vs.repr()
, dan dokumentasinya , juga.ConfigParser
modulJawaban:
Ini
DictWriter
tidak bekerja seperti yang Anda harapkan.with open('dict.csv', 'w') as csv_file: writer = csv.writer(csv_file) for key, value in mydict.items(): writer.writerow([key, value])
Untuk membacanya kembali:
with open('dict.csv') as csv_file: reader = csv.reader(csv_file) mydict = dict(reader)
yang cukup ringkas, tetapi mengasumsikan Anda tidak perlu melakukan konversi jenis apa pun saat membaca
sumber
delimiter=':'
saat membuat penulis dan pembaca :)with
akan lebih baik. Saya akan mengubah contoh untuk mencerminkannya ...\n
, Anda akan masuk\n
ke file). Jika dibiarkan, "mode universal" akan dijalankan dan baris baru diterjemahkan ke default untuk sistem operasi saat ini. Mengingat bahwa ini tidak terlalu berguna di sini (kecuali jika Anda ingin memiliki baris baru yang dapat diprediksi), saya akan menghapusnya.Hanya untuk memberi opsi, menulis kamus ke file csv juga bisa dilakukan dengan paket pandas. Dengan contoh yang diberikan, bisa jadi seperti ini:
mydict = {'key1': 'a', 'key2': 'b', 'key3': 'c'}
import pandas as pd (pd.DataFrame.from_dict(data=mydict, orient='index') .to_csv('dict_file.csv', header=False))
Hal utama yang harus diperhatikan adalah menyetel parameter 'orient' ke 'index' di dalam metode from_dict . Ini memungkinkan Anda memilih apakah Anda ingin menulis setiap kunci kamus di baris baru.
Selain itu, di dalam metode to_csv , parameter header disetel ke False hanya untuk memiliki elemen kamus saja tanpa baris yang mengganggu. Anda selalu dapat mengatur nama kolom dan indeks di dalam metode to_csv.
Output Anda akan terlihat seperti ini:
Jika sebaliknya Anda ingin kunci menjadi nama kolom, cukup gunakan parameter 'orient' default yaitu 'kolom', karena Anda dapat memeriksa di tautan dokumentasi.
sumber
Cara termudah adalah dengan mengabaikan modul csv dan memformatnya sendiri.
with open('my_file.csv', 'w') as f: [f.write('{0},{1}\n'.format(key, value)) for key, value in my_dict.items()]
sumber
key
mendapat koma, Anda akan mengalami saat yang buruk.csv.writer(...).writerows(my_dict.items())
. Thecsv
modul tidak jauh lebih banyak dari hanya menambahkan koma dan baris baru.outfile = open( 'dict.txt', 'w' ) for key, value in sorted( mydict.items() ): outfile.write( str(key) + '\t' + str(value) + '\n' )
sumber
Bisakah Anda melakukan:
for key in mydict.keys(): f.write(str(key) + ":" + str(mydict[key]) + ",");
Sehingga Anda bisa memiliki
key_1: nilai_1, key_2: nilai_2
sumber
','.join("%s:%s" % (k,v) for k,v in mydict.items())
- Anda biasanya lebih baik melakukan iterasi terhadap item dict, yang memberi Anda kunci dan nilai bersama-sama, daripada di atas kunci dict dan melakukan pencarian nilai 'n'.','.join(...)
menangani hanya menempatkan koma di antara nilai, tanpa menambahkan tanda koma tambahan.Saya pribadi selalu menemukan jenis modul csv yang mengganggu. Saya berharap orang lain akan menunjukkan kepada Anda bagaimana melakukan ini dengan licin dengannya, tetapi solusi cepat dan kotor saya adalah:
with open('dict.csv', 'w') as f: # This creates the file object for the context # below it and closes the file automatically l = [] for k, v in mydict.iteritems(): # Iterate over items returning key, value tuples l.append('%s: %s' % (str(k), str(v))) # Build a nice list of strings f.write(', '.join(l)) # Join that list of strings and write out
Namun, jika Anda ingin membacanya kembali, Anda perlu melakukan beberapa penguraian yang menjengkelkan, terutama jika semuanya dalam satu baris. Berikut adalah contoh penggunaan format file yang Anda usulkan.
with open('dict.csv', 'r') as f: # Again temporary file for reading d = {} l = f.read().split(',') # Split using commas for i in l: values = i.split(': ') # Split using ': ' d[values[0]] = values[1] # Any type conversion will need to happen here
sumber
import csv dict = {"Key Header":"Value Header", "key1":"value1", "key2":"value2"} with open("test.csv", "w") as f: writer = csv.writer(f) for i in dict: writer.writerow([i, dict[i]]) f.close()
sumber
#code to insert and read dictionary element from csv file import csv n=input("Enter I to insert or S to read : ") if n=="I": m=int(input("Enter the number of data you want to insert: ")) mydict={} list=[] for i in range(m): keys=int(input("Enter id :")) list.append(keys) values=input("Enter Name :") mydict[keys]=values with open('File1.csv',"w") as csvfile: writer = csv.DictWriter(csvfile, fieldnames=list) writer.writeheader() writer.writerow(mydict) print("Data Inserted") else: keys=input("Enter Id to Search :") Id=str(keys) with open('File1.csv',"r") as csvfile: reader = csv.DictReader(csvfile) for row in reader: print(row[Id]) #print(row) to display all data
sumber
Sudahkah Anda mencoba menambahkan "s" pada:
w.writerow(mydict)
seperti iniw.writerows(mydict)
:? Masalah ini terjadi pada saya tetapi dengan daftar, saya menggunakan tunggal, bukan jamak.sumber