Seite 1 von 1

Welches Dateiformat?

Verfasst: Mittwoch 15. November 2006, 17:19
von Y0Gi
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?.

Verfasst: Mittwoch 15. November 2006, 17:29
von jens
Und die Essenz ab ins Wiki! *vote*

Verfasst: Mittwoch 15. November 2006, 18:56
von gerold
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
:-)

Verfasst: Mittwoch 15. November 2006, 20:01
von Rebecca
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...

Verfasst: Mittwoch 15. November 2006, 22:25
von 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.

Verfasst: Mittwoch 15. November 2006, 22:54
von CrackPod
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

Verfasst: Mittwoch 15. November 2006, 23:12
von Rebecca
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.

Verfasst: Donnerstag 16. November 2006, 09:57
von jens
Nochmal zur Ursprünglichen Frage "Welche Datenbank?", diese Frage soll in der nächsten Linux-User geklärt werden ;)

Verfasst: Donnerstag 16. November 2006, 14:00
von Y0Gi
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.

Verfasst: Donnerstag 16. November 2006, 18:59
von CrackPod
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

Verfasst: Donnerstag 16. November 2006, 19:20
von gerold
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)

Verfasst: Donnerstag 16. November 2006, 19:27
von CrackPod
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

Verfasst: Donnerstag 16. November 2006, 20:20
von Leonidas
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.

Verfasst: Donnerstag 16. November 2006, 20:48
von tabellar
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

Verfasst: Donnerstag 16. November 2006, 21:25
von CrackPod
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

Verfasst: Donnerstag 16. November 2006, 22:06
von Y0Gi
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.

Verfasst: Donnerstag 16. November 2006, 22:31
von gerold
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
:-)

Verfasst: Donnerstag 16. November 2006, 22:38
von gerold
...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
:-)

Verfasst: Donnerstag 16. November 2006, 22:58
von gerold
...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
:-)