Seite 1 von 1

YAML Python

Verfasst: Mittwoch 27. August 2014, 14:51
von sbfly
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

Re: YAML Python

Verfasst: Mittwoch 27. August 2014, 14:58
von Hyperion
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!

Re: YAML Python

Verfasst: Mittwoch 27. August 2014, 15:45
von sbfly
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

Re: YAML Python

Verfasst: Mittwoch 27. August 2014, 15:55
von Hyperion
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?

Re: YAML Python

Verfasst: Freitag 29. August 2014, 12:25
von sbfly
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

Re: YAML Python

Verfasst: Freitag 29. August 2014, 12:54
von /me
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?

Re: YAML Python

Verfasst: Freitag 29. August 2014, 13:50
von sbfly
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 ;-(

Re: YAML Python

Verfasst: Freitag 29. August 2014, 14:03
von Hyperion
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?

Re: YAML Python

Verfasst: Freitag 29. August 2014, 14:44
von EyDu
Der "Dynamic_Parameters"-Teil sieht doch richtig aus, was soll denn daran nicht stimmen?

Re: YAML Python

Verfasst: Samstag 30. August 2014, 04:06
von 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.

Re: YAML Python

Verfasst: Freitag 5. September 2014, 07:36
von sbfly
Sorry es hat so funtktioniert ich hatte noch einen kleinen Syntax Fehler :-)
Vielen Dank für eue Hilfe