Seite 2 von 3

Verfasst: Donnerstag 31. März 2005, 16:07
von mawe
Hi!

Ich hab mal die Einrückung in Deinem Code überarbeitet:

Code: Alles auswählen

import yaml

#-----------------------------------------------------------------
class Vokabelkombination(object):
    """
    Diese Klasse repraesentiert eine Kombination aus Begriffen in
    verschiedenen Sprachen und den zugeh. Hinweisen
    """
    #-----------------------------------------------------------------
    def __init__(self):
        object.__init__(self)
        self.data = {}

    #-----------------------------------------------------------------
    def add(self, lang = "", begr = "", hinw = None):
        """
        Fuegt dem Dictionary eine Begriffseinheit hinzu
        """
        newitem = {"begr" : begr}
        if hinw != None:
            newitem.update({"hinw" : hinw})
     
        if self.data.has_key(lang):
            self.data[lang].append(newitem)
        else:
            self.data[lang] = [newitem]

#-----------------------------------------------------------------
def main():
    kombi = Vokabelkombination()
    f = open("wordlist.txt", "r") # Ergibt ein Datei-Objekt.
    l = f.readline() # Rufe Methode readline() auf Datei auf.
    w = file("yaml.txt", "aU")
    while l:
        print l, # ',' am Ende unterbindet Zeilenvorschub.
        words, translations = l.split('#')
        print "-" * 20
        print words
        print translations
        print "-" * 40
        kombi = Vokabelkombination()
        kombi.add("de", words)
        kombi.add("en", translations)
        w.write(yaml.dump(kombi.data))
        l = f.readline()
    f.close()
    w.close() 

main()
Vielleicht waren bei Dir Tabs und Spaces gemischt. Ich verwende ausschliesslich Spaces (4 Stück pro Einrückung).

Gruß, mawe

Verfasst: Donnerstag 31. März 2005, 16:18
von marco_
und es lag nur an den Einrückungen? Wird wohl länger dauern bis ich mich an das gewöhnt habe. Danke für die Ausbesserung.Jetzt kann ich mich gleich weiter an die Arbeit machen, will doch auch mal mit dem Hauptprojekt anfangen...obwohl ich immernoch keine Ahnung hab wie ich das mit yaml schaffen soll...

Edit:
Ich weiß, ich bin schrecklich, aber ich hab gleich noch eine Frage. Ich hab die Schleife jetzt so geändert, dass words, und translations nochmal aufgeteilt werden und extra gespeichert werden.
Die Schleife sieht jetzt so aus:

Code: Alles auswählen

while l:
        words, translations = l.split('#')
        kombi = Vokabelkombination()
        while words:
            word = words.split(';') 
            kombi.add("de", word)
            w.write(yaml.dump(kombi.data))
        while words:
            translation = translations.split(';')
            kombi.add("en", translation)
            w.write(yaml.dump(kombi.data))
        w.write(yaml.dump(kombi.data))
        l = f.readline()
Ich hab mir da irgendwie eine Endlos-Schleife gebastelt...

Verfasst: Donnerstag 31. März 2005, 17:07
von mawe
Hi!

Naja, in Deinen while-Schleifen werden die words bzw. translations nicht weniger, daher endlos :wink:
Vorschlag:

Code: Alles auswählen

wordlist = words.split(';')
for w in wordlist:
    kombi.add("de", w)
Gruß, mawe

Verfasst: Donnerstag 31. März 2005, 17:52
von marco_
Wenn ich euch nicht hätte...Funktioniert jetzt soweit recht gut. Bekomme folgende Ausgabe:
---
de:
-
begr: Wort5
-
begr: Wort6
-
begr: Wort7
-
begr: Wort8
en:
-
begr: Uebersetzung5
-
begr: Uebersetzung6
-
begr: Uebersetzung7
---
Und jetzt meine Frage an diejenigen die sich mit yaml auskennen (Gerold), kann ich das so stehen lassen, oder muss es unbedingt so aussehen:
---
de:
-
begr: Wort5
begr: Wort6
begr: Wort7
begr: Wort8
en:
-
begr: Uebersetzung5
begr: Uebersetzung6
begr: Uebersetzung7

?????
Bzw. wie geh ich jetzt weiter? Gibt's eine gute Dokumentation die den umgang mit Yaml Datein erklärt? Hab nämlich keine Ahnung was ich damit machen soll.

Verfasst: Donnerstag 31. März 2005, 17:59
von gerold
Hi Marco!
Bitte setze den Code zwischen zwei dieser BB-Tags [code][/code]

Dann sehen wir weiter :wink:

mfg
Gerold
:-)

Verfasst: Donnerstag 31. März 2005, 18:10
von marco_
Hier ist der normale Text-Code

Code: Alles auswählen


---
de:
    -
        begr: Wort1
	begr: Wort2
	begr: Wort3
	begr: Wort4
en:
	begr: Uebersetzung1
	begr: Uebersetzung2
	begr: Uebersetzung3
---
de:
    -
        begr: Wort5
    -
        begr: Wort6
    -
        begr: Wort7
    -
        begr: Wort8
en:
    -
        begr: Uebersetzung5
    -
        begr: Uebersetzung6
    -
        begr: Uebersetzung7
Oder meintest du einen anderen?

Und hier ist der txt2yml Code

Code: Alles auswählen

import yaml

#-----------------------------------------------------------------
class Vokabelkombination(object):
    """
    Diese Klasse repraesentiert eine Kombination aus Begriffen in
    verschiedenen Sprachen und den zugeh. Hinweisen
    """
    #-----------------------------------------------------------------
    def __init__(self):
        object.__init__(self)
        self.data = {}

    #-----------------------------------------------------------------
    def add(self, lang = "", begr = "", hinw = None):
        """
        Fuegt dem Dictionary eine Begriffseinheit hinzu
        """
        newitem = {"begr" : begr}
        if hinw != None:
            newitem.update({"hinw" : hinw})
     
        if self.data.has_key(lang):
            self.data[lang].append(newitem)
        else:
            self.data[lang] = [newitem]

#-----------------------------------------------------------------
def main():
    """Wandelt Datei in .yml um"""
    kombi = Vokabelkombination()
    f = open("wordlist.txt", "r") # Ergibt ein Datei-Objekt.
    l = f.readline() # Rufe Methode readline() auf Datei auf.
    Output = file("yaml.txt", "aU")
    while l:
        words, translations = l.split('#')
        kombi = Vokabelkombination()
        wordlist = words.split(';')
        for w in wordlist:
            kombi.add("de", w)
        translist = translations.split(';')
        for s in translist:
            kombi.add("en", s)
        Output.write(yaml.dump(kombi.data))
        l = f.readline()
    f.close()
    Output.close()

main()

Verfasst: Donnerstag 31. März 2005, 18:12
von gerold
Hi Marco!

Wenn du deine oben angegebene Yaml-Datenstruktur mit meinem Beispiel vergleichst, dann wirst du erkennen, dass die Struktur überein stimmt.

Warum soll es also wie die untere Struktur aussehen?

Ist schon OK so.

Jeder Yaml-Datensatz spiegelt jetzt ein Dictionary mit zwei Items. "de" und "en". Jeder Item enthält eine Liste. In diesen Listen sind wieder Dictionaries mit mindestens einem Item "begr". Es kann auch zusätzlich noch ein Item ("hinw") im Dictionary sein.

Um diese Yaml-Datei in eine Liste einzulesen, kannst du diesen Code verwenden:

Code: Alles auswählen

import yaml
from pprint import pprint
import random

#-----------------------------------------------------------------
def read_yaml():
   """
   Liest den Yaml-Code aus, generiert daraus eine Liste und gibt 
   einen zufällig ausgewählten Eintrag aus.
   """

   DATAFILE = "mein_datenfile.yml"
   datalist = []
   
   yamldata = yaml.loadFile(DATAFILE)
   for item in yamldata:
      datalist.append(item)
   del yamldata
   
   # Nur mal so zum Anzeigen
   pprint(datalist)
   
   # Einen zufällig ausgewaehlten Datensatz anzeigen
   vok_kombi = random.choice(datalist)
   
   # Deutsche Begriffe inkl. Hinweise ausgeben
   print 
   print "=" * 20
   for deutscher_begriff in vok_kombi["de"]:
      print "Deutscher Begriff:", deutscher_begriff["begr"]
      if deutscher_begriff.has_key("hinw"):
         print "   Hinweis", deutscher_begriff["hinw"]
   print "-" * 20
   # Englische Begriffe inkl. Hinweise ausgeben
   for englischer_begriff in vok_kombi["en"]:
      print "Englischer Begriff:", englischer_begriff["begr"]
      if englischer_begriff.has_key("hinw"):
         print "   Hinweis:", englischer_begriff["hinw"]
   print "=" * 20
... und achte bitte darauf, dass mein Code mit drei Leerzeichen eingerückt ist. Wenn dein Code mehr oder weniger Leerzeichen zum Einrücken benutzt, dann musst du den Code anpassen.

Was ich meite, war, dass du in deinem Beitrag den Yaml-Code in Zitat-Tags eingeschlossen hast und nicht in Code-Tags. Deshalb stimmen in der Anzeige die Einrückungen nicht. Die Einrückungen sind aber wichtig.
Du kannst selbst geschriebene Beiträge noch einmal bearbeiten indem du auf den "Edit"-Button klickst.

mfg
Gerold
:-)

Verfasst: Donnerstag 31. März 2005, 18:29
von marco_
Genau darum geht es ja, der obere Teil ist von mit per Hand bearbeitet worden, der untere ist von dem Skript erstellt worden...

Verfasst: Donnerstag 31. März 2005, 18:44
von gerold
... die Namen im Beispiel von mir sind vielleicht ein bischen blöd gewählt, aber die kannst du ja ändern.

Mein Beispiel zum Erstellen der Yaml-Datei erstellt aus einem vorgegebenen Datenkonstrukt (Dictionaries und Listen) einen Yaml-Ausdruck. Dieser wird in eine Datei geschrieben.

Diese Yaml-Datei wird im Beispiel (read_yaml) wieder ausgelesen und damit das ursprüngliche Datenkonstrukt wiederhergestellt. Mit diesen Dictionaries und Listen kannst du alles tun was man normalerweise damit machen kann.

- durchsuchen
- durchlaufen
- ansehen
- verändern
- ...

mfg
Gerold
:-)

Verfasst: Donnerstag 31. März 2005, 21:04
von jens
Vielleicht einfach auch nur, wegen falscher Einrückung ?!?

Hab mal aus der while-Schleife eine for gemacht:

Code: Alles auswählen

def main():
    kombi = Vokabelkombination()
    f = file("wordlist.txt", "r") # Ergibt ein Datei-Objekt.
    w = file("yaml.txt", "aU")
    for l in f.readlines():
        print l, # ',' am Ende unterbindet Zeilenvorschub.
        words, translations = l.split('#')
        print "-" * 20
        print words
        print translations
        print "-" * 40
        kombi = Vokabelkombination()
        kombi.add("de", words)
        kombi.add("en", translations)
        w.write(yaml.dump(kombi.data))
            
    f.close()
    w.close() 

Verfasst: Mittwoch 20. April 2005, 13:26
von marco_
So, wie bereits geschrieben hab ich mich für die Einfache TextDatei entschieden. Das ist ja kein Problem solang jede Zeile dem Aufbau von Wort#Übersetzung folgt. Was mach ich aber wenn ich auf einmal den Aufbau Wort#Übersetzung#Tipp will...

Ich dachte mir ich werde nach jedem # einen Buchstaben hinzufügen, der angibt ob es sich um eine Übersetzung einen Tipp oder ähnlichem handelt, also #WWort#ÜÜbersetzung#TTipp . Wie kann man das am besten lösen?

Verfasst: Mittwoch 20. April 2005, 14:40
von Leonidas
Ich täts halt einfach mit line.split('#') machen, wobei dann die alternativen Übersetzungen jeweils mit ';' voneinander geteilt wären. Damit wäre dann [0] das Wort, [1] die Übersetzungen und [2] die Tipps.

Verfasst: Mittwoch 20. April 2005, 14:48
von marco_
Ja schon klar, so mach ichs auch schon. Ich will das ganze aber etwas erweitern, sodass nicht immer ein Tipp vorhanden sein muss oder so dass ich eine Lautssprache hinzufügen kann wenn ich will.
Der normale Aufbau ist ja nur Wort;wort;Wort#Übersetzung;Übersetzung
aber wenn jetzt von fünfzig Vokabeln eines Mit dem Aufbau Wort;Wort#Übersetzung;Übersetzung#Lautssprache#Tipp ist, steigt das Programm aus. Deswegen wollte ich fragen was für Möglichkeiten es gibt dies zu ermöglichen.

Verfasst: Mittwoch 20. April 2005, 15:21
von Leonidas

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-

s = "WWort;Wort#ÜÜbersetzung;Übersetzung#LLautssprache#TTipp"
w = {}
for element in s.split('#'):
    print element
    if element.startswith('W'):
        w['Wort'] = element[1:].split(';')
    elif element.startswith('Ü'):
        w['Übersetzung'] = element[1:].split(';')
    elif element.startswith('L'):
        w['Lautsprache'] = element[1:].split(';')
    elif element.startswith('T'):
        w['Tipp'] = element[1:].split(';')

print w
Textdateien sind halt ein suboptimales Speicherformat.

Verfasst: Mittwoch 20. April 2005, 15:42
von marco_
Naja, welche Dateiart soll ich den sonst nehmen, YAML ist mir leider zu kompliziert...
bzw. Danke für die Hilfe, echt super gelöst

Verfasst: Mittwoch 20. April 2005, 15:44
von Leonidas
marco_ hat geschrieben:Naja, welche Dateiart soll ich den sonst nehmen, YAML ist mir leider zu kompliziert...
Ich würde ja einfach pickle/mashall nehmen. Und wenn es unbedingt menschenlesbar sein sollte dann in XML serialisieren (also eine Art pickle im XML Format). Aber gut, es ist ja dein Programm, lass dich nicht zu sehr von mir beeinflussen*g*

Verfasst: Mittwoch 20. April 2005, 15:47
von marco_
Gibt es denn eine gute Dokumentation oder Anleitungen für XML unter Python?

Verfasst: Mittwoch 20. April 2005, 16:06
von Leonidas
marco_ hat geschrieben:Gibt es denn eine gute Dokumentation oder Anleitungen für XML unter Python?
Mit XML Marshalling Modulen brauchst du XML nicht mal zu können, du sagst (etwas vereinfacht) MarshallerModul.dump(objektmitdeinendaten, dateiname) und schon wird eine gültige XML Datei auf deiner Festplatte gespeichert. Diese kannst du dann wieder einlesen und exakt so verwenden, wie vor dem "einlegen".

Aber ja, es gibt das Buch Python & XML, sowie ein ganzes kapitel zu dem Thema im Python Cookbook.