Dictionary 1:1 in Datei speichern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Hallo zusammen,

Mein Code zum Erzeugen des Dictionary, sieht so aus:

Code: Alles auswählen

base = [{(row[0], row[1]) : row} for row in Data.LoadList('quelldaten')]
Das Ergebnis einer von vielen Zeilen aus base, würde dann so aussehen:

Code: Alles auswählen

{('Rotwein', 'Trollinger') : ['001', '284711', 'Rotwein Trollinger, 1980', '0,75 Liter']}
Wie kann ich so ein Dictionary in eine Datei speichern, so daß das Dictionary in der Datei erhalten bleibt?

Grüße Nobuddy
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Ich bin jetzt, auf diese Lösung gekommen:

Code: Alles auswählen

#!/usr/bin/python3
# -*- coding: utf-8 -*-


import os
import sys
import codecs
import data_load as Data

def SaveDict(listname, Dict):
    """
    Speichere das Dictionary in die Datei.
    Aufruf:
    SaveDict(listname, Liste)
    """

    a = codecs.open(Data.Path(listname), "w")
    for x in Dict:
        a.write('{}\n'.format(x))

base = [{(row[0], row[1]) : row} for row in Data.LoadList('quelldaten')]

SaveDict('test', base)
BlackJack

@Nobuddy: `base` ist kein Dictionary sondern eine Liste. Und zwar eine Liste voll mit Dictionaries mit genau einem Schlüssel/Wert-Paar.

Warum würde man diese Datenstruktur haben wollen und dann noch alle Einträge als Zeichenkettendarstellung von Python-Datentypen in eine Datei schreiben wollen? Das ist kein Format in dem man Daten speichern sollte. Zum einen von der Struktur her, und zum anderen nicht in Python-Syntax. Wahrscheinlich würde eine CSV-Datei mit den `row`-Objekten die `Data.LoadList()` liefert, die bessere Variante sein.

Warum verwendest Du in Python 3 `codecs.open()`? Und dann auch noch ohne eine Kodierung anzugeben.
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Hallo BlackJack,
BlackJack hat geschrieben:@Nobuddy: `base` ist kein Dictionary sondern eine Liste. Und zwar eine Liste voll mit Dictionaries mit genau einem Schlüssel/Wert-Paar.
Das habe ich inzwischen auch feststellen müssen, so macht das keinen Sinn. :wink:
BlackJack hat geschrieben:Warum würde man diese Datenstruktur haben wollen und dann noch alle Einträge als Zeichenkettendarstellung von Python-Datentypen in eine Datei schreiben wollen? Das ist kein Format in dem man Daten speichern sollte. Zum einen von der Struktur her, und zum anderen nicht in Python-Syntax. Wahrscheinlich würde eine CSV-Datei mit den `row`-Objekten die `Data.LoadList()` liefert, die bessere Variante sein.
Ich hatte mir das etwas anderst vorgestellt, als wie Du es ausgeführt hast, aber leider zutrifft.
Ich hatte mir gedacht, ob es möglich ist ein Dictionary aus einer Datei heraus nutzen zu können.
Ich weiß, Thema Datenbanken ... wäre ideal, aber das möchte ich vermeiden.
Bisher nutze ich auch eine CSV-Datei mit den `row`-Objekten die `Data.LoadList()` liefert, was sehr gut funktioniert.
Häufig benötigt man doch Dictionaryś, die einfach zu handeln sind, daher auch meine Überlegung.
BlackJack hat geschrieben:Warum verwendest Du in Python 3 `codecs.open()`? Und dann auch noch ohne eine Kodierung anzugeben.
Ich dachte, daß der Eintrag '# -*- coding: utf-8 -*-' auf `codecs.open()` hätte, dem ist aber wohl nicht so, wie ich Deiner Frage entnehmen kann.

Ist es generell nicht möglich, wie von mir angedacht, aus einer Datei direkt heraus ein Dictionary zu nutzen?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Nobuddy: wenn mit "nutzen" gemeint ist, einen Eintrag zu lesen ohne die ganze Datei einzulesen, dann würde ich mir nichts eigenes erfinden sondern sqlite benutzen. Ansonsten ist eine csv-Datei das deutlich bessere Format als Deine Repräsentation von dict-Objekten.
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Hallo Sirius3,

habe es jetzt verstanden, entweder Datenbank oder csv-Datei.
Meine Idee, war wohl die 'Eierlegende Wolfsmichsau' .... :wink:
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@BlackJack, @Sirius3: Warum kein json (mit string als key)?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@mutetella: Was wäre dadurch gewonnen? Da wären die Schlüssel dann redundant gespeichert und so ein Wörterbuch kann man auch aus CSV-Daten beim Einlesen ganz einfach erstellen.
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Hallo zusammen,

nach reiflicher Überlegung, bin ich zu dem Resultat gekommen:
- Listen als csv-Dateien zu speichern, wie ich es zuvor schon getan habe.
- Statt mit Listen zu arbeiten, verwende ich nun ausschließlich Dictionaryś.

Der Vorteil ist, wesentlich schnellere Verarbeitung der Daten und mit:
- dict.items()
- dict.values()
- dict.keys()
lässt sich allews machen.

Grüße Nobuddy
Antworten