yaml datei auslesen

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.
Xisto
User
Beiträge: 23
Registriert: Dienstag 8. Juli 2008, 09:06

Samstag 1. November 2008, 14:42

Hallo

ich bin ein relativ unerfahrener Python Progamierer und habe folgende Frage ich schreibe mit Hilfe von YAML ein paar variablen in eine Datei.

Code: Alles auswählen

yamlOut = {}
        yamlOut["xof"] = xuntenneu
        yamlOut["yof"] = yuntenneu
        yamlOut["xuf"] = xobenneu
        yamlOut["yuf"] = nunteny
        yamlOut["yse"] = size[1]
        yamlOut["xse"] = sizeneu[0]
        yamlOut["winkel"] = winkel
        
        yamlFile = open(r'C:\calib.yaml', 'w')
        yamlFile.write(yaml.dump(yamlOut))    
        yamlFile.close()
Jetzt stehen die Daten auch in dieser Datei.

({xse: 2206, yse: 371, winkel: 6.0498779844552217, xof: 56, xuf: 2262, yof: 1093, yuf: 371})

Jetzt möchte ich diese Daten wieder in einem anderen Python Programm verwenden, aber ich weiß leider nicht wie ich sie wieder auslesen kann.
Danke schon mal für die Hilfe
DasIch
User
Beiträge: 2478
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Samstag 1. November 2008, 14:47

yaml.load? Das wird doch sicher dokumentiert sein, im Zweifel würde ich vermuten dass es sich ähnlich dem (c)pickle Modul aus der stdlib verhält oder simplejson.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Samstag 1. November 2008, 14:54

Na komm. Wenn ich mit Google nach "python yaml" suche, finde ich als ersten Treffer PyYAML und dort steht doch weiter unten auf der Seite ein Beispiel, in dem man sehen kann, dass `yaml.load` eine YAML-Datei lesen kann.

Wenn du es geschafft hast, dir YAML zu installieren (was ja nicht Teil von Python ist) dann musst du doch schon mal genau auf dieser Seite gewesen sein oder aber zumindest von PyYAML gehört haben.

Stefan

Übrigens, ich würde ja

Code: Alles auswählen

yaml_out = {
  "xof": ...,
  "yof": ...,
  "yuf": ...,
  ...
}
benutzen, da sich dies in Python wesentlich besser liest.

Und bist du auf YAML festgelegt? Da es eine externe Bibliothek ist, finde ich es total lästig, diese erst extra installieren zu müssen. Bei Python 2.6 gibt es JSON-Unterstützung. Das Format könnte für deinen Zweck genauso gut geeignet sein. Schließlich kannst du auch einfach `repr(yaml_out)` in eine Textdatei schreiben und dann wieder mit `eval` einlesen, wenn du garantieren kannst, dass niemand dir in deine Datei "bösen" Code schreibt. Bei Python 2.6 gibt es außerdem eine Variante für eval, mit der man garantieren kann, dass nur Literale gelesen werden.
Xisto
User
Beiträge: 23
Registriert: Dienstag 8. Juli 2008, 09:06

Samstag 1. November 2008, 15:58

ja diese seite kenne ich mein hauptproblem ist aber das ich ja eine Datei auf meiner Festplatte habe die die daten ja enthält.
ich aber nicht weis wie ich die jeweiligen Daten auslesen kann da ich die werte ja auch als integer benötige

Code: Alles auswählen

import yaml
yamlFile = open(r'C:\calib.yaml', 'w')
yaml.load(yaml.dump(yamlFile))
Wenn ich dies mache kommt immer der fehler.:

<closed file '<uninitialized file>', mode '<uninitialized file>' at 0x01395F50>
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 1. November 2008, 17:54

Das scheint ein generelles Problem beim Verständnis von Dateien zu sein. Du öffnest die Datei zum Schreiben (``w``), da kannst du sie nicht sofort zum Lesen verwenden. Du musst sie schließen und zum Lesen (``r``) öffnen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sonntag 2. November 2008, 10:25

Xisto hat geschrieben:

Code: Alles auswählen

yaml.load(yaml.dump(yamlFile))
Dies versucht ja auch den File-Handle zu "dumpen", nicht irgendwelche Objekte. Das macht wenig Sinn. Im deinem ersten Beispiel stand da noch richtiger "yamlOut".

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

Sonntag 2. November 2008, 12:40

``yaml.safe_load()`` bietet sich an.


sma: In Punkto "mitgeliefert" mag JSON seit 2.6 ein Vorteil sein und ich haber daher (und weil man bei AJA[X]-Gefrickel ohnehin meist irgendwo JSON benutzt) öfter schon die Umstellung erwogen und/oder durchgeführt. Noch ist 2.6 in meinen Augen nicht weit genug verbreitet (nicht zuletzt wg. Debian [Lenny-Release] und Ubuntu [noch kein "Jaunty"-Repo]). Dazu kommt, dass JSON im Gegensatz zu YAML Strings unbedingt mit Anführungszeichen begrenzt. Dadurch ist YAML von Anwendern deutlich leichter zu schreiben (und zu lesen, aber das halte ich für weniger wichtig), was vermutlich auch die Popularität von YAML in der Ruby-Welt für die Konfiguration (z. B. bei Rails) mit erklären dürfte.

Das Thema Geschwindigkeit mag in den meisten Fällen nicht so bedeutend sein, rechtfertigt aber bei Bedarf gewöhnlich eine zusätzliche Abhängigkeit. Das komplexere YAML (Superset von JSON) dürfte, gerade bei der Auswertung von eigenen Typen, deutlich hinter dem (aus gutem Grund) sehr begrenzten JSON zurück stehen. Dazu kommt, dass die simplejson-Version in der Standardlib langsamer als die separate Version sein soll und IIRC auch nicht die C-Erweiterungen mitbringt/nutzt [citation needed].
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 2. November 2008, 14:17

``simplejson`` ist in der Tat schneller als das in 2.6 integrierte ``json``, aber das wird in einem der folgenden Releases (2.6.1 oder 2.7, vermutlich auch in 3.0, weiß nicht genau wie das dann gehandhabt wird) aktualisiert. Nicht dass es mit der Geschwindigkeit von ``json`` Probleme geben sollte.

Die Popularität von YAML in der Ruby-Welt erkläre ich mir daher weil es von dort ursprünglich stammt und seit 1.8.x (wobei mir das exakte x nicht bekannt ist) in der Stdlib von Matz-Ruby mitgeliefert wird (Syck von _why).
My god, it's full of CARs! | Leonidasvoice vs Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mittwoch 5. November 2008, 10:59

Unterschiedliche Performance wird IMHO in den allermeisten Anwendungen, wo ein paar Konfigurationsdaten gelesen werden, keine Rolle spielen.

Ich mag einfach keine externen Bibliotheken, die man auch noch je nach Plattform speziell kompilieren muss, weil sie C-Anteile haben. Das behindert die plattformübergreifende Entwicklung und gibt uns (das ist auf die Python-Entwickler in der Firma bezogen) einen schwereren Stand gegenüber Java. In der Firma z.B. haben wir Vista, OS X und Ubunutu als Betriebssysteme und wollen unsere Programme aus einem gemeinsamen Repository möglichst ohne spezielle Installationen betreiben.

Ansonsten: Ja, das man bei YAML keine Anführungszeichen um Strings herum setzen muss, kann nett sein, widerspricht aber der explizit ist besser Philosophie von Python, oder? Man kann "Scalaren" nicht ansehen, ob es Zahlen oder Zeichenketten sind.

Ich halte YAML auch im Gegensatz zu XML oder JSON oder S-Ausdrücken für viel zu kompliziert. In dem ursprünglich ehrenhaften Versuch, eine lesbare Alternative zu XML zu schaffen, ist man IMHO an Featurities gestorben.

Stefan
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 5. November 2008, 11:02

sma hat geschrieben:Ansonsten: Ja, das man bei YAML keine Anführungszeichen um Strings herum setzen muss, kann nett sein, widerspricht aber der explizit ist besser Philosophie von Python, oder? Man kann "Scalaren" nicht ansehen, ob es Zahlen oder Zeichenketten sind.
Ja, ich glaub das war auch eine Sache, wo die Ursprünglichen Entwickler von PyYAML auseinandergedacht haben, so kann ich mich erinnnern, dass es einen "Strings are king" Fork gab, der ich glaube dort alles als Strings behandelt hat - wollte man etwas anderes, dann musste man explizit konvertieren.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Mittwoch 5. November 2008, 19:11

Die Alles-ist-ein-String-Sichtweise in XML stinkt da natürlich auch ab. Wer's sauber will, nimmt JSON. Ansonsten kann YAML Strings auch in Anführungszeichen einschließen, darüber lässt sich ja vielleicht was deichseln.
lunar

Mittwoch 5. November 2008, 21:00

Y0Gi hat geschrieben:Die Alles-ist-ein-String-Sichtweise in XML stinkt da natürlich auch ab. Wer's sauber will, nimmt JSON.
XML-Schemata existieren, man kann auch in XML Datentypen verwalten.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Mittwoch 5. November 2008, 21:27

Schema-Validierung findet bei XML aber nicht bereits automatisch im Parser statt. Genau genommen weiß ich gar nicht auf Anhieb, ob das mit Stdlib-Bordmitteln überhaupt geht. Wer weiß mehr?
lunar

Mittwoch 5. November 2008, 21:46

Genau genommen weiß ich gar nicht auf Anhieb, ob das mit Stdlib-Bordmitteln überhaupt geht. Wer weiß mehr?
Keine Ahnung, ich nutze die Module der Standardbibliothek nicht, da sie lxml unterlegen sind. Die ElementTree-Implementierung der Standardbibliothek unterstützt ja noch nicht mal XPath.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 5. November 2008, 23:19

lunar hat geschrieben:Die ElementTree-Implementierung der Standardbibliothek unterstützt ja noch nicht mal XPath.
Ach XPath, das wäre ja ok; aber warum hat ElementTree kein ``parent()`` auf Nodes, so wie lxml das hat? Zum navigieren finde ich das nämlich recht praktisch.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten