Welches Dateiformat?

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Ich würde mich aufgrund meiner diversen Erfahrungen auch für YAML entscheiden.

gerold: Ich weiß nicht, ob ich deine Kritik daran richtig verstanden habe, aber IMHO kann das Format da auch nichts für, wenn sich jemand beim Hinzufügen von Daten nicht daran hält. Und selbst das kann man noch in eine einfache Eingabe per Kommandozeile oder GUI verpacken, während das YAML-Paket dann die Konvertierung übernimmt.

Edit (Leonidas): Von Für und gegen __slots__ abgetrennt und davor von Welches Datenbanksystem?.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Und die Essenz ab ins Wiki! *vote*

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi Y0Gi!

Dann versuche ich mal meine Gedanken dazu in Worte zu fassen und meine Entscheidung, im Beispiel ein eigenes Textformat zu verwenden, zu begründen.
Heute würde ich wahrscheinlich das Datenformat von KVocTrain (XML) einsetzen und auf Grund meiner großen Erfahrung mit GUIs eine gute Eingabeoberfläche dafür erstellen. Aber dazu später...
Y0Gi hat geschrieben:aber IMHO kann das Format da auch nichts für, wenn sich jemand beim Hinzufügen von Daten nicht daran hält.
Hierbei war es mir (während meines Gedankenspiels zum Thema Vokabeltrainer) wichtig, dass Vokabeln **einfach** hinzugefügt werden können. Das bedeutet, dass der Benutzer sich auch mal das Textfile öffnen kann und, so nebenbei, auf die Schnelle ein paar hundert Vokabeln eingeben kann.

Sobald es eine komfortable Eingabeoberfläche gibt, spielt das Datenformat nur mehr eine untergeordnete Rolle.

Ich war einmal der Meinung, dass YAML für so etwas recht gut geeignet sei (siehe: http://www.python-forum.de/post-17122.html#17122), bis ich anderen dabei zusah, wie sie Artikel in eine YAML-Datei eingeben mussten. Das war erbärmlich!

Einmal mit Tab, einmal ein Leerzeichen zu viel, dann wurden ein paar Bezeichner groß und andere Bezeichner klein geschrieben. -- Schlicht gesagt: Ein Chaos.

Diesen Fehler werde ich (hoffentlich) nicht mehr machen. Wenn ich möchte, dass eine Datendatei für Menschen schreibbar sein soll, dann muss diese einfach gehalten werden. Und auf keinen Fall darf es etwas ausmachen, wenn im Text ein paar Zeilenumbrüche mehr drinnen sind, als gedacht.
Y0Gi hat geschrieben:eine einfache Eingabe per Kommandozeile oder GUI verpacken
Wenn es nie geplant ist, dass der Benutzer die Datendatei angreifen soll, dann würde ich das Datenformat eines bekannten und bewährten freien Programms wählen. Damit würde man eine Synergie schaffen, die nicht zu unterschätzen ist. Man könnte das auch kombinieren, indem man zwar ein eigenes Format verwendet, aber den Import und Export in mindestens eines der beliebtesten anderen Programme beherrscht. Das bedeutet auch, dass man sich die anderen Datenformate ansehen muss oder zumindest herausfinden muss, welche Informationen gespeichert werden müssen.

Beide Programme profitieren dann von der Beliebtheit des anderen. Beide könnten die Daten untereinander austauschen, was dir sofort einen rießigen Vorteil bringen würde. Du hättest auf einen Schlag Zugriff auf fertige Wörterbücher. Auch das andere Programm würde davon profitieren.

Allerdings muss dann die Eingabeoberfläche wirklich komfortabel sein und auch ohne Maus schnell und leicht bedienbar sein. Dann -- und nur dann ist es egal (zumindest für den Benutzer), welches Datenformat du für die Speicherung verwendest.

XML, Yaml, Json -- Mit diesen Datenformaten liegt man nicht schlecht, denn das erlaubt anderen Programmierern auch auf *deine* Daten zuzugreifen, zu verändern oder einfach wieder nur als Basis für ein eigenes Programm oder ein Zusatzprodukt zu deinem Programm zu verwenden.

Noch etwas: Abwärtskompatibel bleiben. Neuere Versionen des Programms müssen mühelos mit älteren Datendateien klar kommen.

Was will ich eigentlich sagen? Eine wirklich gute Eingabeoberfläche zu erstellen ist nicht so einfach, wie manche glauben mögen. Es kostet Zeit, eine gute Eingabeoberfläche zu entwickeln. Denn, es gibt kaum etwas einfacheres als die Eingabe von Daten in eine Textdatei oder in eine Tabelle. Das muss man erst mal toppen.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

gerold hat geschrieben: Eine wirklich gute Eingabeoberfläche zu erstellen ist nicht so einfach, wie manche glauben mögen. Es kostet Zeit, eine gute Eingabeoberfläche zu entwickeln. Denn, es gibt kaum etwas einfacheres als die Eingabe von Daten in eine Textdatei oder in eine Tabelle. Das muss man erst mal toppen.
Das ist wahr! Deswegen bin ich auch fuer einfache Textformate, wo immer sie moeglich sind.

Bei einem Vokabeltrainer will man ja aber eventuell mehr speichern als nur Wortpaare. Wichtig faende ich z.B. wie gut der User die Vokabel schon kann und wann sie das letzte Mal abgefragt wurde etc. D.h. man hat schon ein paar mehr Daten in einem Datensatz, und einige davon sind nur zur internen Verwendung gedacht. Die muesste der User in einer Textdatei jedesmal ueberfluessigerweise mit eintragen...
BlackJack

Diese Zusatzdaten gehören aber nicht unbedingt mit in die Datei mit den Vokabeln. Sonst gibt man auch die persönlichen Fortschritte und Einstellungen weiter, wenn man die Datei jemand anderem gibt. Es wäre ausserdem problematisch Vokabeln systemweit ohne Schreibzugriff für einfache Benutzer zu installieren.
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Ok, danke für die vielen Informationen :D
Ich denke, ich werde mich auf Textdateien beschränken.
Als Format habe ich jetz ersteinmal xml genommen, da ich das halt kenne :wink:
Ich habe mir folgende Aufteilung überlegt:
3 Dateien. Eine mit dem Vocabeln:

Code: Alles auswählen

<vocabulary>
	<voc id=1>
		<vocable>error</vocable>
		<translation>Fehler</translation>
		<hint>A misstake</hint>
	</voc>
	<voc id=2>
		<vocable>window</vocable>
		<translation>Fenster</translation>
		<hint>You can see through ~s if they're cleaned</hint>
	</voc>
	<voc id=3>
		<vocable>school</vocable>
		<translation>Schule</translation>
		<hint>In ~ you'll be teached</hint>
	</voc>
</vocabulary>
Eine mit den Kategorien(damit man die Vokabeln grupieren kann)

Code: Alles auswählen

<categories>
	<category id=1>
		<name>Englishtest</name>
	</category>
</categories>
Und dann noch eine mit (persönlichen-)Informationen zu den Vokabeln

Code: Alles auswählen

<vocable_informations>
	<vocable id=1>
		<category id=1 />
		<misstakes count=1 />
	</vocable>
	<vocable id=2>
		<category id=1 />
		<misstakes count=0 />
	</vocable>
	<vocable id=3>
		<category id=1 />
		<misstakes count=0 />
	</vocable>
</vocable_informations>
Was haltet ihr davon? Gibt es einen guten xml Parser, mit dem man auch einfach neue xml-"Datensätze" einfügen kann? Also quasi ein object

Code: Alles auswählen

xml.vocable_informations.add('vocable',4)
xml.vocable_informations.voable[4].add('category',1)
xml.vocable_informations.voable[4].add('misstakes',1)
Was dann eine neue Vokabel an der richtigen Stelle einfügt:

Code: Alles auswählen

[...]
	<vocable id=3>
		<category id=1 />
		<misstakes count=0 />
	</vocable>
	<vocable id=4>
		<category id=1 />
		<misstakes count=1 />
	</vocable>
</vocable_informations>
LG Tobi
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

BlackJack hat geschrieben:Diese Zusatzdaten gehören aber nicht unbedingt mit in die Datei mit den Vokabeln. Sonst gibt man auch die persönlichen Fortschritte und Einstellungen weiter, wenn man die Datei jemand anderem gibt. Es wäre ausserdem problematisch Vokabeln systemweit ohne Schreibzugriff für einfache Benutzer zu installieren.
Da haste irgendwie recht. Aber: KVoctrain macht das so. In KVocTrain kann man, glaube ich, kann eine Vokabeldatei "zuruecksetzen", bevor man sie weitergibt (kanns nicht nachgucken, habe auf diesem Rechner kein KVocTrain). Globale Dateien, die sich mehrere Benutzer teilen, sind dann natuerlich nicht moeglich.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Nochmal zur Ursprünglichen Frage "Welche Datenbank?", diese Frage soll in der nächsten Linux-User geklärt werden ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

gerold: Danke für die Erläuterungen. Wenn ich so recht überlege, wird mir klar, dass u.a. XML, YAML und JSON zwar wenig ihrer Eigenschaft (mehr oder weniger) "human-readable" zu sein ein wenig "gehyped" werden, letztlich aber den Nachteil haben, nur bedingt, d.h. bis zu einer gewissen Komplexität "human-writable" zu sein. Seien es besondere Verschachtelungen, Escaping von Sonderzeichen oder anderes, da steht der unbedarfte Anwender dann in der Tat wie der Ochs vom Berg. Für relativ simple, wenn auch leider oft (speziell bei XML) umfangreiche Konfigurationsdateien (XML u.a. bei vielen Apache-Produkten, YAML sehr erfolgreich und IMHO nachahmenswert bei Rails) scheint es aber gerade so auszureichen. Aber da kommt man in der Regel auch mich ASCII-Zeichen aus.
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Nachdem ich mir Json angeschaut habe, glaube ich, werde ich Json benutzen... Nur brauche ich eben eine Klasse oder sonstwas, was mit Json Dateien umgehen kann.
Sprich, dass die Json Datei gelesen wird und in ein Objekt umgewandelt wird, damit ich die Daten einfach editieren kann. Beispiel:
Datei:

Code: Alles auswählen

{
  "vocable" : "school",
  "translation" : [
    "schule",
    "penne"
  ],
  "optionals" : ""
}
{
  "vocable" : "go",
  "translation" : "gehen"
  "optionals" : [
    "went",
    "gone"
  ]
}

Code: Alles auswählen

jsonhandler = JSONHanlder('datei.json')
vocabs = jsonhandler.decode()
#jetzt kann ich auf die einzelnen Objekte mit ihren Werten einfach über
#das vocabs Objekt zugreifen
print vocabs.id[0].vocable #gibt dann school aus
print vocabs.id[1].optionals[0] #gibt went aus
vocabs.id[0].translation[1] = "Pauke" #ändert die zweite Übersetzung
#von Penne in Pauke
jsonhandler.encode(vocabs) #schreibt die aktualisierte Datei
Hab ich das verständlich erklärt? Gibt es sowas? Wenn ja wäre es super!
Oder gibt es Einwände,warum ich JSON nicht hernehmen sollte?

LG Tobi
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

CrackPod hat geschrieben:Nur brauche ich eben eine Klasse oder sonstwas, was mit Json Dateien umgehen kann.
Hi Tobi!

Ich glaube du suchst so etwas:
- http://cheeseshop.python.org/pypi/simplejson
- http://cheeseshop.python.org/pypi/demjson

lg
Gerold
:-)

Edit: http://cheeseshop.python.org/pypi/python-json (aus der Liste herausgenommen)
Zuletzt geändert von gerold am Donnerstag 16. November 2006, 22:02, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Hab ich mir angeschaut, aber ich werd aus der Doku von dene nich so ganz schlau... gibt es irgendwo was ausführlicheres?
Um es zu spezifizieren: Ich weiß nich, wie ich das JSON Objekt in Python aufbauen muss. http://deron.meranda.us/python/demjson/ ... mjson.html hier steht nix und weitere Dokuseiten gibt(oder ich find sie) nicht...
Kann mir das vielleicht jemand mit nem kleinem Bsp erklären? Die simplejason-Doku bringt mir irgendweie auch nix^^ Ich weiß nich, wie ich das Objekt erstell bzw damit arbeite...

LG Tobi
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Würde von abraten, da Bob Ippolito simple_json eben gestartet hat weil JSON-Py so schlecht war.
gerold hat geschrieben:Hab ich mir angeschaut, aber ich werd aus der Doku von dene nich so ganz schlau... gibt es irgendwo was ausführlicheres?
Vielleicht hier. simple_json ist überhaupt eine gute Wahl, wird von TurboGears und Pocoo verwendet.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
tabellar
User
Beiträge: 186
Registriert: Mittwoch 4. September 2002, 15:28

Wenn es nicht gerade JSON sein muss, geht es für den Anfang vielleicht
noch einfacher :wink: :

Variante 1: Modul schreiben und importieren

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
# Modul: vocabs.py

vocab_list = [
{
  "vocable"     : "school",
  "translation" : ["schule", "penne"],
  "optionals"   : []
},
{
  "vocable"     : "go",
  "translation" : ["gehen"],
  "optionals"   : [ "went", "gone" ],
},
]


vocab_dict = {
"school":
    {"translation" : ["schule", "penne"],
     "optionals"   : []
    },
"go":
    {"translation" : ["gehen"],
     "optionals"   : ["went", "gone"],
    },  
}

import vocab Liste:
from vocabs import vocab_list as vocabs
vocabs[0]['vocable']
>>> 'school'
import vocab Dict
from vocabs import vocab_dict as vocabs
vocabs['school']['translation']
>>>["schule", "penne"]

Vorteil: Einfacher Import und Bearbeitung der Datei mit Editor
Nachteil: Daten können nicht zurückgeschrieben werden


Variante 2: Python shelve DB

import shelve

#create new shelve db
db = shelve.open("vocabs.db", writeback=True)
db['go'] = {'translation': ['gehen'], 'optionals': ['went', 'gone']}
db['school'] = {'translation': ['schule', 'penne'], 'optionals': []}
db.close()

#open shelve db and make a modification
db = shelve.open("vocabs.db", writeback=True)
db['school']['translation']
>>> ['schule', 'penne']
db['school']['translation'][1] = 'pauke'
db['school']['translation']
>>> ['schule', 'pauke']

#show the db keys
db.keys()
>>> ['go', 'school']
db.close()
Vorteil: Einfaches Datenhandling, Daten werden direkt in DB geschrieben
Nachteil: DB kann nicht mit Editor bearbeitet werden


Variante 3:
Man könnte noch mit eval() eine Textdatei als Python Datenstruktur
einlesen und wieder rausschreiben. Das ist dann aber ein Kapitel für sich
und nicht so die feine Art ... :roll:

Tabellar
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Hallo,

irgendwie denke ich immer zu kompliziert... Darauf hätte ich auch von alleine kommen können =P
Ich denke, ich werde so arbeiten. Danke Tabellar.

LG Tobi
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Die YAML- und wohl auch JSON-Parser funktionieren so, dass du einfach (Python-)Datenstrukturen wie Zahlen, Strings, Listen, Dictionaries an eine Funktion übergibst, die dir die entsprechende YAML-/JSON-Darstellung ausgibt - und vice versa.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

CrackPod hat geschrieben:Kann mir das vielleicht jemand mit nem kleinem Bsp erklären?
Hi Tobi!

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import demjson
import codecs
import encodinghelper

data = {
    1: {"sprache1": u"Vorname (öäü)", "sprache2": u"first name"},
    2: {"sprache1": u"Nachname (öäü)", "sprache2": u"last name"},
    3: {"sprache1": u"Tisch (öäü)", "sprache2": u"Table"},
}

# Schreiben
f = codecs.open(r"J:\Ablage\vocfile.voc", "wb", encoding = "utf-8")
json = demjson.encode(data, compactly = False, escape_unicode = False)
f.write(json)
f.close()

print json

# Lesen
f = codecs.open(r"J:\Ablage\vocfile.voc", "rb", encoding = "utf-8")
new_data = demjson.decode(f.read())
f.close()

print new_data
print type(new_data)
@Leonidas: Ich habe nicht raus gefunden, wie man den JSON-Code mit ``simplejson`` schön formatiert bekommt.

lg
Gerold
:-)
Zuletzt geändert von gerold am Samstag 18. November 2006, 01:26, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

...einfacher, aber dafür wird die Datei auch nicht UTF-8-codiert gespeichert:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import demjson
import encodinghelper

data = {
    1: {"sprache1": u"Vorname (öäü)", "sprache2": u"first name"},
    2: {"sprache1": u"Nachname (öäü)", "sprache2": u"last name"},
    3: {"sprache1": u"Tisch (öäü)", "sprache2": u"Table"},
}

# Schreiben (nur ASCII, kein UTF-8)
f = file(r"J:\Ablage\vocfile.voc", "wb")
json = demjson.encode(data, compactly = False)
f.write(json)
f.close()

print json

# Lesen (nur ASCII, kein UTF-8)
f = file(r"J:\Ablage\vocfile.voc", "rb")
new_data = demjson.decode(f.read())
f.close()

print new_data
print type(new_data)
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

...und so gehts mit pyYAML:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import yaml # http://pyyaml.org/wiki/PyYAML

data = {
    1: {"sprache1": u"Vorname (öäü)", "sprache2": u"first name"},
    2: {"sprache1": u"Nachname (öäü)", "sprache2": u"last name"},
    3: {"sprache1": u"Tisch (öäü)", "sprache2": u"Table"},
}

# Schreiben
f = file(r"J:\Ablage\vocfile.voc", "wb")
yamlstr = yaml.dump(data, f)
f.close()

# Lesen
f = file(r"J:\Ablage\vocfile.voc", "rb")
new_data = yaml.load(f)
f.close()

print new_data
print type(new_data)
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten