YAML Python

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.
Antworten
sbfly
User
Beiträge: 32
Registriert: Montag 17. Oktober 2011, 14:57

HAllo ich habe eine yml Datei die unteranderem folgende Zeilen beinhaltet

Code: Alles auswählen

Ipf_Conf:                               
  - Name: Number
    Value: 1
Nun Möchte ich das diese YML Attribut in Python ändern:

Dazu möchte ich die Datei einlesen
Dann nur das Attribute aufrufen dieses ändern
und die Datei wieder zurück legen

kennt einer hierfür einen weg ?

Vielen Dank
Zuletzt geändert von Anonymous am Samstag 30. August 2014, 01:36, insgesamt 1-mal geändert.
Grund: Quelltext in YAML-Code-Tags gesetzt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

sbfly hat geschrieben: kennt einer hierfür einen weg ?
Am besten Du benutzt ein YAML-Lib; iirc gibt es da eine namens PyYaml ;-) Such einfach mal bei https://pypi.python.org/pypi!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
sbfly
User
Beiträge: 32
Registriert: Montag 17. Oktober 2011, 14:57

Hallo

ich habe das http://pyyaml.org/wiki/PyYAMLDocumentation mal mir etwas durch gesehen

habe auch versucht eine Datei zu importieren

Code: Alles auswählen

import yaml

stream = open("mnt/data1/Egon/tool/example.yaml", 'r')
print yaml.load(stream)
Leider funktioniert es nicht bin ich da auf dem richtigen weg ?

hier die Fehler Meldung:

Code: Alles auswählen

File "/usr/lib64/python2.6/site-packages/yaml/__init__.py", line 71, in load
    return loader.get_single_data()
  File "/usr/lib64/python2.6/site-packages/yaml/constructor.py", line 37, in get_single_data
    node = self.get_single_node()
  File "/usr/lib64/python2.6/site-packages/yaml/composer.py", line 36, in get_single_node
    document = self.compose_document()
  File "/usr/lib64/python2.6/site-packages/yaml/composer.py", line 55, in compose_document
    node = self.compose_node(None, None)
  File "/usr/lib64/python2.6/site-packages/yaml/composer.py", line 84, in compose_node
    node = self.compose_mapping_node(anchor)
  File "/usr/lib64/python2.6/site-packages/yaml/composer.py", line 133, in compose_mapping_node
    item_value = self.compose_node(node, item_key)
  File "/usr/lib64/python2.6/site-packages/yaml/composer.py", line 84, in compose_node
    node = self.compose_mapping_node(anchor)
  File "/usr/lib64/python2.6/site-packages/yaml/composer.py", line 133, in compose_mapping_node
    item_value = self.compose_node(node, item_key)
  File "/usr/lib64/python2.6/site-packages/yaml/composer.py", line 84, in compose_node
    node = self.compose_mapping_node(anchor)
  File "/usr/lib64/python2.6/site-packages/yaml/composer.py", line 127, in compose_mapping_node
    while not self.check_event(MappingEndEvent):
  File "/usr/lib64/python2.6/site-packages/yaml/parser.py", line 98, in check_event
    self.current_event = self.state()
  File "/usr/lib64/python2.6/site-packages/yaml/parser.py", line 428, in parse_block_mapping_key
    if self.check_token(KeyToken):
  File "/usr/lib64/python2.6/site-packages/yaml/scanner.py", line 116, in check_token
    self.fetch_more_tokens()
  File "/usr/lib64/python2.6/site-packages/yaml/scanner.py", line 257, in fetch_more_tokens
    % ch.encode('utf-8'), self.get_mark())
yaml.scanner.ScannerError: while scanning for the next token
found character '\t' that cannot start any token
Zuletzt geändert von Hyperion am Mittwoch 27. August 2014, 15:52, insgesamt 1-mal geändert.
Grund: Code in Python-Code Tags gesetzt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Bitte setze Code in Zukunft doch in die dafür vorgesehenen Tags!

Naja, die Meldung ist doch offensichtlich: Dein YAML-File enthält kein gültiges YAML-Dokument.

BTW: Dateien sollte man immer so öffnen:

Code: Alles auswählen

with open(...) as f:
    # f ist hier Dein Dateihandler (Du solltest ihm einen besseren Namen geben!)
    # f wird *automatisch* geschlossen, auch nach einer Ausnahme.
Wieso verwendest Du so ein altes Python? 2.7.8 ist das aktuelle aus dem 2er Zweig... gibt es da triftige Gründe für 2.6.x?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
sbfly
User
Beiträge: 32
Registriert: Montag 17. Oktober 2011, 14:57

Vielen Dank tatsächlich war etwas an meinem YAML File nicht in Ordnung

Aber leider komme ich immer noch nicht viel weiter

gibt es den keine Funktion mit der ich ein attribute des yaml file aus lesen kann und dieses ersetzen kann
und zu guter letzt das file wieder speichern kann stehe hier komplett auf dem schlauch


Gruß

sbfly
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

sbfly hat geschrieben:gibt es den keine Funktion mit der ich ein attribute des yaml file aus lesen kann und dieses ersetzen kann
Ich verstehe dein Problem nicht wirklich. Du bekommst doch ein Dictionary zurück das du ganz normal bearbeiten kannst.

Code: Alles auswählen

def modify_yaml(filename):
    with open(filename) as fp:
        data = yaml.safe_load(fp)

    data['europe']['netherlands'] = 42

    with open(filename, 'w') as fp:
        yaml.safe_dump(data, fp)
Woran hapert es denn?
sbfly
User
Beiträge: 32
Registriert: Montag 17. Oktober 2011, 14:57

mhh ich weiss ja selbst nicht ganz wo das problem liegt

ich glaube es liegt daran das mein yaml fiel schlecht ist :-)

also der Aufbau ist wie folgt:

Code: Alles auswählen

---
Ipf_Conf:                               
  Name: "EGON"
  Version: 0.12345             
  Test: false                                        
  Time:
     Start: 20131010_094200000000        
     Stop: 20131010_100200000000			
  Dynamic_Parameters:       
  - Name: SizeErrors
    Value: true
  - Name: '*****'
    Value: notice
  - Name: '*****'
    Value: "null"
  - Name: number of                  
    Value: 8

Ich habe nun den code angepasst auf:

Code: Alles auswählen

def modify_yaml(filename):
        with open(filename) as fp:
             data = yaml.safe_load(fp)
             data["Ipf_Conf"]["Dynamic_Parameters"][3]["Value"] = 13
        with open(filename,'w') as fp:
             yaml.safe_dump(data, fp)
Aber es Funktioniert nicht wenn ichs manuel eingebe sieht danach auch noch mein yaml file anders aus

Code: Alles auswählen

  Dynamic_Parameters:
  - {Name: SizeErrors, Value: true}
  - {Name: *****, Value: notice}
  - {Name: *****, Value: 'null'}
  - {Name: number of, Value: 13}
irgendwie bin ich ja langsam nah dran ;-(
Zuletzt geändert von Anonymous am Samstag 30. August 2014, 03:44, insgesamt 1-mal geändert.
Grund: YAML-Code-Tags korrigiert
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Lass Dir doch mal mit ``prettyprint`` das Dictionary ausgeben! Ich denke das YAMl passt nicht zum Dictionary Key-"Pfad"; ich sehe da nirgends einen Eintrag mit "Ipf_Conf" in der Datei!

Ach ja: "Funktioniert nicht" ist auch keine tolle Aussage - *was* klappt denn nicht und *was* kommt als Fehler oder *was* hättest Du erwartet?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Der "Dynamic_Parameters"-Teil sieht doch richtig aus, was soll denn daran nicht stimmen?
Das Leben ist wie ein Tennisball.
BlackJack

@sbfly: Im YAML kann man Abbildungen und Sequenzen auf verschiedene Arten darstellen und für die Abbildungen in der ``Dynamic_Parameters``-Sequenz wird beim serialisieren halt eine andere Darstellungsart („flow”) als im Ausgangsdokument („block”) gwählt. Beides beschreibt aber das gleiche Dokument. Also abgesehen von der gewollten Änderung des Wertes 8 in 13.

Problematischer fänd ich eher die Version und die Zeitangaben. Sind das im Originaldokument auch *Zahlen*?

Bei den Sternchen nehme ich mal an das da was stand was Du rauseditiert hast, denn das wäre so wie's da steht ungültig weil ein Sternchen eine Referenz auf einen Wert darstellt der mit einem Anker markiert ist.
sbfly
User
Beiträge: 32
Registriert: Montag 17. Oktober 2011, 14:57

Sorry es hat so funtktioniert ich hatte noch einen kleinen Syntax Fehler :-)
Vielen Dank für eue Hilfe
Antworten