Ich habe ein Wörterbuch:
mydict = {key1: value_a, key2: value_b, key3: value_c}
Ich möchte die Daten in diesem Stil in eine Datei dict.csv 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 Zeile und alle Werte in der nächsten Zeile.
Wenn ich es schaffe, eine solche Datei zu schreiben, möchte ich sie auch in ein neues Wörterbuch zurücklesen.
Um meinen Code zu erklären, 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. Einstellungen speichern sollte das Wörterbuch auf die erwähnte Weise in die Datei schreiben (um dem Benutzer das direkte Bearbeiten der CSV-Datei zu erleichtern), Ladeeinstellungen sollten aus der Datei lesen und die Textelemente und Kontrollkästchen aktualisieren.
quelle
key1, value_a [linebreak] key2, value_b [linebreak] key3, value_c
durepr()
, das Diktat zu schreiben und die Zeichenfolge beim Einlesen zu bewerten. In diesem alten SO-Beitrag finden Sie eine Diskussion überstr()
vs.repr()
und die Dokumente .ConfigParser
Modul überprüfenAntworten:
Das
DictWriter
funktioniert nicht so, wie Sie es erwarten.Um es zurückzulesen:
Das ist ziemlich kompakt, setzt aber voraus, dass Sie beim Lesen keine Typkonvertierung durchführen müssen
quelle
delimiter=':'
wenn Sie den Autor und den Leserwith
wäre die Verwendung besser. Ich werde die Beispiele ändern, um es zu reflektieren ...\n
, gelangen Sie\n
in die Datei). Wenn Sie dies alleine lassen, wird der "Universalmodus" aktiviert und die Zeilenumbrüche werden in die Standardeinstellung für das aktuelle Betriebssystem übersetzt. Da es hier nicht wirklich nützlich ist (außer wenn Sie vorhersehbare Zeilenumbrüche wünschen), werde ich es entfernen.Nur 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 ungefähr so sein:
mydict = {'key1': 'a', 'key2': 'b', 'key3': 'c'}
Die wichtigste zu berücksichtigende Sache ist, den Parameter 'orient' innerhalb 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.
Zusätzlich wird innerhalb der to_csv- Methode der Header-Parameter auf False gesetzt, um nur die Wörterbuchelemente ohne störende Zeilen zu haben. Sie können jederzeit Spalten- und Indexnamen innerhalb der to_csv-Methode festlegen.
Ihre Ausgabe würde folgendermaßen aussehen:
Wenn Sie stattdessen möchten, dass die Schlüssel die Spaltennamen sind, verwenden Sie einfach den Standardparameter 'orient', der 'Spalten' ist, wie Sie in den Dokumentationslinks überprüfen können.
quelle
Am einfachsten ist es, das CSV-Modul zu ignorieren und selbst zu formatieren.
quelle
key
ein Komma bekommen, werden Sie eine schlechte Zeit haben.csv.writer(...).writerows(my_dict.items())
. Dascsv
Modul kann so viel mehr als nur Kommas und Zeilenumbrüche hinzufügen.quelle
Können Sie einfach tun:
Damit du haben kannst
Schlüssel_1: Wert_1, Schlüssel_2: Wert_2
quelle
','.join("%s:%s" % (k,v) for k,v in mydict.items())
- Sie sind normalerweise besser dran, über die Elemente eines Diktats zu iterieren, wodurch Sie Schlüssel und Werte zusammen erhalten, als über die Schlüssel eines Diktats und 'n' Wert-Lookups durchzuführen.','.join(...)
sorgt dafür, dass nur Kommas zwischen Werte gesetzt werden, ohne das zusätzliche nachfolgende Komma hinzuzufügen.Ich persönlich fand das CSV-Modul immer etwas nervig. Ich gehe davon aus, dass Ihnen jemand anderes zeigen wird, wie man das geschickt macht, aber meine schnelle und schmutzige Lösung lautet:
Wenn Sie es jedoch wieder einlesen möchten, müssen Sie einige irritierende Analysen durchführen, insbesondere wenn alles in einer Zeile steht. Hier ist ein Beispiel mit Ihrem vorgeschlagenen Dateiformat.
quelle
quelle
quelle
Haben Sie versucht, das "s" hinzuzufügen:
w.writerow(mydict)
so :w.writerows(mydict)
? Dieses Problem ist mir passiert, aber bei Listen habe ich Singular anstelle von Plural verwendet.quelle