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