Seite 1 von 3
Wie am besten Datei aufbauen?
Verfasst: Dienstag 29. März 2005, 08:30
von marco_
Hallo, ich hab vor mir ein Vokabel-Tool zu basteln. das heißt ich hab eine normale Textdatei, pro Zeile ein Wort und die Übersetzungen.
Jetzt ist aber die Frage, wie ich die Textdatei am besten anlegen soll. Ich dachte mir am besten so in etwa:
Wort#Übersetzung1;übersetzung2;Übersetzung3...#Tipp,Lautssprache,etc.
Wie ihr seht, hätte ich gerne mehrere Übersetzungen, die gewertet werden.
Wie würdet ihr die Datei anlegen bzw. denkt ihr das das für Python realisierbar ist oder gitb es da irgendwelche Probleme?
Verfasst: Dienstag 29. März 2005, 09:39
von hehejo
Du kannst die Datei mit vielen Varianten erstellen.
Deine Vorstellung entspricht ja einer CSV Datei.
Eine andere Alternative ist XML.
Du könntest dir aber auch Klassen bauen, die genau einer Zeile entsprechen, Für jede "Zeile" baust du dir dann eine Instanz welche du dann zum Speichern in eine Datei "cpickle"st (serialisiert).
Dann hast du aber keine Textdatei mehr.
Verfasst: Dienstag 29. März 2005, 11:32
von Leonidas
hehejo hat geschrieben:Eine andere Alternative ist XML.
XML ist was feines zum lesen, aber XML Dateien selberschreiben macht weniger Spaß, deswegen empfehle ich dir dazu XML Persistenz mit
XMarshaL oder
PyXO oder
EaseXML.
hehejo hat geschrieben:Du könntest dir aber auch Klassen bauen, die genau einer Zeile entsprechen, Für jede "Zeile" baust du dir dann eine Instanz welche du dann zum Speichern in eine Datei "cpickle"st (serialisiert).
Dieser Weg ist sehr einfach und schnell zu gehen, aber man kann aber auch noch andere Ansätze gehen, wie über die
ZODB oder
Durus. Zu guter letzt kannst du das in eine SQL Datenbank speichern, beispielsweise mit
PySQLite. Und wenn du kein SQL magst kannst du immer noch ORM verwenden. Der SQL Ansatz hat halt den Vorteil, dass du die Datenbanken auch mit anderem Programmen öffnen kannst aber auch als Textdateien dumpen kannst.
Verfasst: Dienstag 29. März 2005, 12:11
von jens
Man könnte auch ganz billig den eingebauten ConfigParser nutzen... Da gibt es zwar keine Listen, aber ein .split(",") tut auch nicht weh...
Verfasst: Dienstag 29. März 2005, 12:35
von Leonidas
jens hat geschrieben:Man könnte auch ganz billig den eingebauten ConfigParser nutzen... Da gibt es zwar keine Listen, aber ein .split(",") tut auch nicht weh...
Das kann aber die Dateien nicht anlegen, oder sehe ich das falsch?
Was ich noch gefunden habe:
EaseXML, das scheint ziemlich in Ordnung zu sein, das sollte ich mir auch noch ansehen.
Verfasst: Dienstag 29. März 2005, 12:46
von marco_
Ist ja recht nett, dass ihr versucht mir zu helfen. Verstehe aber so gut wie nichts...
Es ging mir zuerst nur mal darum wie ich die Datei schreiben muss um sie später bequem in mein Projekt zu implementieren. Ich werde mich erst kommende Woche mit Python beschäftigen können, wollte aber die Datein mit den Wörtern schon schreiben.
Also bitte noch mal ganz einfach, so das ich es auch verstehen? Wie würdet ihr die Datei aufbauen um sie später mit Python verwenden zu können?
Ein ganz normales Vokabel-Programm, mit einem Wort und mehreren Möglichen Lösungen.
Verfasst: Dienstag 29. März 2005, 13:18
von Leonidas
Ach du must die Datei von Python aus gar nicht schreiben. Wunderbar!
Was du jetzt machen kannst hängt ab, wie "hochwertig" deine Lösung sein soll:
Man kann es so wie jens vorgeschlagen hat, ganz billig mit dem
ConfigParser machen, oder auch mit dem
csv-Modul. Das ist wohl am einfachsten.
Ich würde die Datei als XML machen und sie von Python aus mit den XML Modulen oder mit irgendwelchen
Tools einlesen. Das hat den Vorteil, dass das Foramt für Menschen praktisch sofort ersichtlich ist, ohne, dass man erst überlegen muss wofür Feld frei in Spalte 7 ist
Code: Alles auswählen
<?xml version="1.0" encoding="UTF-8"?>
<vokabeln>
<vokabel>
Grenze
<englisch>boundary</englisch>
<englisch>border</englisch>
<englisch>frontier</englisch>
</vokabel>
</vokablen>
Daraus ist gleich ersichtlich worum es geht.
Verfasst: Dienstag 29. März 2005, 13:27
von marco_
Und das funktioniert einfach so? Ich hätte da eher an eine ganz normale Textdatei gedacht...die kann man schnell und einfach schreiben.
Wird das bei deiner XML Version nicht sehr schnell viel zu lang. Es geht hier nicht um zehn-zwanzig sondern um hunderte Vokabeln und da wird
Code: Alles auswählen
<?xml version="1.0" encoding="UTF-8"?>
<vokabeln>
<vokabel1>
Grenze
<englisch>boundary</englisch>
<englisch>border</englisch>
<englisch>frontier</englisch>
</vokabel1>
<vokabel2>
Haus
<englisch>home</englisch>
</vokabel1>
<vokabel3>
essen
<englisch>eat</englisch>
</vokabel1>
<vokabel4>
BBGdgf
<englisch>dsfdsf</englisch>
<englisch>sfdf</englisch>
<englisch>sfd</englisch>
</vokabel4>
</vokablen>
einfach zu lang. Außerdem ist es umständlich zu schreiben.
Gibt es da nicht einfach eine ganz einfache, simple Methode so ein dummes Vokabel-Programm zu erstellen?
Re: Wie am besten Datei aufbauen?
Verfasst: Dienstag 29. März 2005, 13:40
von gerold
marco_ hat geschrieben: Wie würdet ihr die Datei anlegen?
Hallo Marco!
Ich persönlich würde dafür
pyYAML http://www.pyyaml.org/ verwenden. YAML ("YAML Ain't Markup Language") ist ein Textformat, mit dem es möglich ist, komplexe Datenstrukturen in reiner Textform abzubilden. YAML kann, wenn nötig, auch in XML umgewandelt werden.
Wort#Übersetzung1;übersetzung2;Übersetzung3...#Tipp,Lautssprache,etc.
Dein Beispiel (leicht erweitert mit der Möglichkeit, mehrere deutsche Begriffe zu mehreren englichen Begriffen...) könnte in YAML so aussehen:
Code: Alles auswählen
--- #YAML:1.0
de:
-
BEGR: Deutscher Begriff 1
-
BEGR: Möglicher zweiter, deutscher Begriff
HINW: Hier könnte ein Hinweis stehen
en:
-
BEGR: Englischer Begriff 1
LAUT: Hier könnte ein Lautsprachenausdruck stehen
-
BEGR: Englischer Begriff 2
TIPP: Hier könnte ein Tipp stehen
-
BEGR: Englischer Begriff 3
HINW: Hier könnte wieder mal ein Hinweis stehen
TIPP: Noch ein Tipp dazu
---
de:
-
BEGR: Deutscher Begriff 1
-
BEGR: Möglicher zweiter, deutscher Begriff
HINW: Hier könnte ein Hinweis stehen
en:
-
BEGR: Englischer Begriff 1
LAUT: Hier könnte ein Lautsprachenausdruck stehen
-
BEGR: Englischer Begriff 2
TIPP: Hier könnte ein Tipp stehen
-
BEGR: Englischer Begriff 3
HINW: Hier könnte wieder mal ein Hinweis stehen
TIPP: Noch ein Tipp dazu
Der Code:
Code: Alles auswählen
import yaml
data = yaml.loadFile(r"C:\yamltest.yml")
for item in data:
print item
del data
generiert daraus folgendes Datenkonstrukt:
Code: Alles auswählen
{
'de': [
{
'BEGR': 'Deutscher Begriff 1'
},
{
'HINW': 'Hier k\xc3\xb6nnte ein Hinweis stehen',
'BEGR': 'M\xc3\xb6glicher zweiter, deutscher Begriff'
}
],
'en': [
{
'BEGR': 'Englischer Begriff 1',
'LAUT': 'Hier k\xc3\xb6nnte ein Lautsprachenausdruck stehen'
},
{
'TIPP': 'Hier k\xc3\xb6nnte ein Tipp stehen',
'BEGR': 'Englischer Begriff 2'
},
{
'HINW': 'Hier k\xc3\xb6nnte wieder mal ein Hinweis stehen',
'BEGR': 'Englischer Begriff 3', 'TIPP': 'Noch ein Tipp dazu'
}
]
}
{
'de': [
{
'BEGR': 'Deutscher Begriff 1'
},
{
'HINW': 'Hier k\xc3\xb6nnte ein Hinweis stehen',
'BEGR': 'M\xc3\xb6glicher zweiter, deutscher Begriff'
}
],
'en': [
{
'BEGR': 'Englischer Begriff 1',
'LAUT': 'Hier k\xc3\xb6nnte ein Lautsprachenausdruck stehen'
},
{
'TIPP': 'Hier k\xc3\xb6nnte ein Tipp stehen',
'BEGR': 'Englischer Begriff 2'
},
{
'HINW': 'Hier k\xc3\xb6nnte wieder mal ein Hinweis stehen',
'BEGR': 'Englischer Begriff 3', 'TIPP': 'Noch ein Tipp dazu'
}
]
}
War nur mal so ein Gedanke
mfg
Gerold
EDIT: Ich habe das Beispiel geändert, da eine Liste zu viel drinnen war.
Verfasst: Dienstag 29. März 2005, 13:48
von marco_
Danke gerold, das gefällt mir doch schon viel besser. Vor allem ist es nicht allzu umständlich zu schreiben, auch wenn das End-Ergebnis sicher sehr lange wird.
Und das kann man dann problemlos in Python als Projekt integrieren? So dass er per Zufalls-Prinzip ein Vokabel auswählt, und die Antwort abfragt und dann sagt ob es richtig oder falsh war?
Verfasst: Dienstag 29. März 2005, 13:57
von gerold
marco_ hat geschrieben:Und das kann man dann problemlos in Python als Projekt integrieren? So dass er per Zufalls-Prinzip ein Vokabel auswählt, und die Antwort abfragt und dann sagt ob es richtig oder falsh war?
Hi Marco!
Natürlich
Dieses Datenmodell ist sehr einfach um weitere Sprachen erweiterbar und funktioniert in alle Richtungen (deutsch-englisch, englisch-deutsch).
mfg
Gerold

Verfasst: Dienstag 29. März 2005, 14:01
von marco_
Na, dann scheint es ja genau das zu sein was ich gesucht habe. Sobald ich mit der Text-Datei fertig bin, frage ich um Hilfe wie es weitergeht...bis dahin hab ich auch schon mein Python-BUch bekommen

Verfasst: Dienstag 29. März 2005, 14:03
von Mr_Snede
Hier gibt es ja schöne Ideen.
Ich hoffe, der Thread bleibt noch etwas länger aktiv - da kann ich vielleicht auch die ein oder andere Idee stibitzen :-))
Aber nun zum Thema,
wie hehejo schon anmerkte mag dir eine Datei als csv gefallen.
Sie könnte vielleicht so aussehen:
Code: Alles auswählen
"deutsches Wort";"englisch1,englisch2, ...";"Zusatzinfos"
"Grenze";"boundary,border,frontier";"Zusatzinfos"
Das ist einfach mit dem csv Modul zu benutzen. Unter Umständen kannst du sogar auf die Anführungszeichen verzichten. Da ich aber schon länger das csv Modul nicht benutzt habe, lege ich dafür keine Hand ins Feuer.
Aber ehrlich gesagt, finde ich die XML Version wie sie Leonidas vorschlägt eleganter.
cu Sebastian
Verfasst: Dienstag 29. März 2005, 14:05
von marco_
Ich denke eher yaml ist genau das was ich gesucht habe. Deutsch-Englisch, Englisch-Deutsch, Mehrere Lösungen in beiden Sprachen. Was will man mehr.
Verfasst: Dienstag 29. März 2005, 14:22
von jens
marco_ hat geschrieben:...auch wenn das End-Ergebnis sicher sehr lange wird.
Meinst du die Dateigröße???
Dann könntest du gzip nutzen:
Code: Alles auswählen
import gzip
testfile = "test.zip"
zFile = gzip.GzipFile( mode='wb', fileobj=file( testfile, "wb" ) )
zFile.write("Das ist ein Test")
zFile.close()
Verfasst: Dienstag 29. März 2005, 16:30
von marco_
meinte eher die Dateilänge.
Für gzip brauch ich eigentlich kein Script, da reicht ein einfacher Befehl in der Konsole auch aus.
Verfasst: Dienstag 29. März 2005, 16:34
von jens
Nein nein, mit dem Python Modul gzip kannst du direkt von Python aus transparent aus der gzip-Datei lesen/schreiben.
Verfasst: Dienstag 29. März 2005, 17:45
von mawe
Hi!
Also ich weiß nicht, irgendwie find ich die bisherigen Lösungen für ein einfaches Vokabelprogramm zu übertrieben.
Code: Alles auswählen
Wort#Übersetzung1;übersetzung2;Übersetzung3...#Tipp#Lautssprache
Die Struktur find ich nicht schlecht. So kann man die Zeile einfach auftrennen
und ob die Antwort eine richtige Übersetzung ist, mit
Code: Alles auswählen
if guess in translations.split(';'):
print "right"
else:
print "wrong"
überprüfen.
Gruß, mawe
Verfasst: Dienstag 29. März 2005, 18:10
von Leonidas
mawe hat geschrieben:Also ich weiß nicht, irgendwie find ich die bisherigen Lösungen für ein einfaches Vokabelprogramm zu übertrieben.
Hey, mawe, das soll nicht irgendein Vokabelprogramm werden, sondern ein sehr gutes. Und ich finde auch das YAML sich dafür seht gut eignet.
Man kann auch statt gzip auch bzip2 (aus Python) verwenden, das komprimiert in der Regel besser.
Verfasst: Dienstag 29. März 2005, 18:28
von marco_
Natürlich will ich ein sehr gutes

(Naja ein funktionierendes wäre natürlich noch besser)
Hmm, hab jetzt versucht ein paar Vokabeln einzugeben und muss sagen das ist sehr anstrengend auf die Dauer. Dachte ich bastel mir ein kleiens Python-Script (Wofür versuch ich es denn zu lernen?)
Hab mir das so gedacht:
1)Als erstes eine Abfrage welche Sprache die erste ist.
2) Das gleiche mit der zweiten Sprache
3)Eine for Schleife
3a)Deutsches-Wort1
3b)Deutsches-Wort2
3c)Deutsches-Wort3
3d)Englisches-Wort1
3e)Englisches-Wort2
3f)Englisches-Wort3
3g)In Datei Speichern.
Wüsste nicht wie ich die Eingabe sonst vereinfachen könnte. Ist ziemlich umständlich...