Wie am besten Datei aufbauen?

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.
marco_
User
Beiträge: 78
Registriert: Freitag 25. März 2005, 12:24

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?
hehejo
User
Beiträge: 56
Registriert: Freitag 18. Februar 2005, 18:24
Wohnort: Stein
Kontaktdaten:

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.
Gruß, Johannes
[b][color=red]ascii stupid question,
get stupid ansii[/color][/b]
[url]http://www.hehejo.de[/url]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Man könnte auch ganz billig den eingebauten ConfigParser nutzen... Da gibt es zwar keine Listen, aber ein .split(",") tut auch nicht weh...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
marco_
User
Beiträge: 78
Registriert: Freitag 25. März 2005, 12:24

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
marco_
User
Beiträge: 78
Registriert: Freitag 25. März 2005, 12:24

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?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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.
Zuletzt geändert von gerold am Dienstag 29. März 2005, 22:23, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
marco_
User
Beiträge: 78
Registriert: Freitag 25. März 2005, 12:24

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?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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 8)

Dieses Datenmodell ist sehr einfach um weitere Sprachen erweiterbar und funktioniert in alle Richtungen (deutsch-englisch, englisch-deutsch).

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
marco_
User
Beiträge: 78
Registriert: Freitag 25. März 2005, 12:24

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 :roll:
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

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
marco_
User
Beiträge: 78
Registriert: Freitag 25. März 2005, 12:24

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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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()

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
marco_
User
Beiträge: 78
Registriert: Freitag 25. März 2005, 12:24

meinte eher die Dateilänge.

Für gzip brauch ich eigentlich kein Script, da reicht ein einfacher Befehl in der Konsole auch aus.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Nein nein, mit dem Python Modul gzip kannst du direkt von Python aus transparent aus der gzip-Datei lesen/schreiben.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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

Code: Alles auswählen

word, translations, tip, lsp = line.split('#')
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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
marco_
User
Beiträge: 78
Registriert: Freitag 25. März 2005, 12:24

Natürlich will ich ein sehr gutes :P (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...
Antworten