it-swarm.com.de

Schreiben eines Wörterbuchs in eine CSV-Datei mit einer Zeile für jeden 'key: value'

Ich habe ein Wörterbuch: 

mydict = {key1: value_a, key2: value_b, key3: value_c}

Ich möchte die Daten in einer Datei dict.csv in diesem Stil schreiben:

key1: value_a
key2: value_b
key3: value_c

Ich hab geschrieben:

import csv
f = open('dict.csv','wb')
w = csv.DictWriter(f,mydict.keys())
w.writerow(mydict)
f.close()

Aber jetzt habe ich alle Schlüssel in einer Reihe und alle Werte in der nächsten Reihe.

Wenn ich eine solche Datei schreibe, möchte ich sie auch in ein neues Wörterbuch zurücklesen.

Um meinen Code zu erläutern, enthält das Wörterbuch Werte und Bools aus textctrls und Kontrollkästchen (mit wxpython). Ich möchte die Schaltflächen "Einstellungen speichern" und "Einstellungen laden" hinzufügen. Die Einstellungen sollten das Wörterbuch in der genannten Weise in die Datei schreiben (um dem Benutzer das direkte Bearbeiten der CSV-Datei zu erleichtern), sollten die Einstellungen geladen werden Lesen Sie aus der Datei und aktualisieren Sie die Textdateien und Kontrollkästchen.

65
user1106770

Die DictWriter arbeitet nicht so, wie Sie es erwarten.

with open('dict.csv', 'w') as csv_file:
    writer = csv.writer(csv_file)
    for key, value in mydict.items():
       writer.writerow([key, value])

Um es zurückzulesen:

with open('dict.csv') as csv_file:
    reader = csv.reader(csv_file)
    mydict = dict(reader)

dies ist ziemlich kompakt, setzt jedoch voraus, dass Sie beim Lesen keine Typumwandlung durchführen müssen

142

Am einfachsten ist es, das CSV-Modul zu ignorieren und es selbst zu formatieren.

with open('my_file.csv', 'w') as f:
    [f.write('{0},{1}\n'.format(key, value)) for key, value in my_dict.items()]
10
Phil Horowitz

Um eine Option zu geben, könnte das Schreiben eines Wörterbuchs in eine CSV-Datei auch mit dem Pandas-Paket erfolgen. Mit dem gegebenen Beispiel könnte es so aussehen:

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))

Die Hauptsache, die berücksichtigt werden muss, ist, den 'Orient'-Parameter in der from_dict -Methode auf' Index 'zu setzen. Auf diese Weise können Sie auswählen, ob Sie jeden Wörterbuchschlüssel in eine neue Zeile schreiben möchten. 

Außerdem wird der Header-Parameter innerhalb der to_csv - Methode auf False gesetzt, um nur die Dictionary-Elemente ohne störende Zeilen zu haben. Sie können jederzeit Spalten- und Indexnamen in der To_csv-Methode festlegen.

Ihre Ausgabe würde so aussehen:

key1,a
key2,b
key3,c

Wenn Sie stattdessen möchten, dass die Schlüssel die Spaltennamen sind, verwenden Sie einfach den Standardparameter 'Orient', dh 'Spalten', da Sie die Dokumentationslinks überprüfen können.

7
Ivan Calderon
outfile = open( 'dict.txt', 'w' )
for key, value in sorted( mydict.items() ):
    outfile.write( str(key) + '\t' + str(value) + '\n' )
3
FCAlive

Kannst du nur:

for key in mydict.keys():
    f.write(str(key) + ":" + str(mydict[key]) + ",");

Damit du es haben kannst 

schlüssel_1: Wert_1, Schlüssel_2: Wert_2

2
louis.luo

Ich persönlich fand das CSV-Modul immer etwas nervig. Ich gehe davon aus, dass jemand anderes Ihnen zeigen wird, wie Sie dies schnell tun können, aber meine schnelle und schmutzige Lösung ist:

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

Wenn Sie es jedoch noch einmal lesen möchten, müssen Sie das Parsing irritieren, insbesondere wenn es sich um eine Zeile handelt. Hier ist ein Beispiel, das Ihr vorgeschlagenes Dateiformat verwendet.

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
1
Griffith Rees
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() 

enter image description here

0
Apurva Thorat

Ich bin ein Noob, auch spät zu diesen Kommentaren, haha, aber haben Sie versucht, die "s" hinzuzufügen: w.writerow (mydict) wie folgt: w.writerows (mydict), dieses Problem ist mir aber passiert Listen verwendete ich Singular statt Plural. Pops! war fix.

0
Hikhuj