2016-05-27 26 views
1

Ich bin Neuling auf Python und YAML, ich habe eine Situation, wo ich brauche diese Datei zu halten, mit dem entsprechenden Daten angehängtWie man Yaml-Datei mit Python aktualisieren?

__blocks: {} 
     messages: 
      CANMessages: 
      - CAN: !!python/unicode 'IuK-CAN' 
       D0: 
       - 13 
       D1: 
       - 0 
       D2: 
       - 0 
       D3: 
       - 0 
       D4: 
       - 0 
       D5: 
       - 0 
       D6: 
       - 240 
       D7: 
       - 0 
       DL: 7 
       Description: !!python/unicode 'clo' 
       ID: 574 
       Period: -1 
       id: d3206970-20f2-11e6-bfd7-185e0fc5ec33 
       timestamp: 1464013797.767 
      - CAN: !!python/unicode 'IuK-CAN' 
       D0: 
       - 13 
       D1: 
       - 0 
       D2: 
       - 0 
       D3: 
       - 0 
       D4: 
       - 0 
       D5: 
       - 0 
       D6: 
       - 240 
       D7: 
       - 0 
       DL: 7 
       Description: !!python/unicode 'cli' 
       ID: 574 
       Period: -1 
       id: d37y069700f2-11e6-bfd7-185e0fc5ec33 
       timestamp: 1487013797.767 
      MOSTMessages: [] 
     pages: [] 
     settings: {} 

Nur Inhalte, die hier sind von -CAN den Teil angefügt werden muss zu

- CAN:          //1 
.. 
timestamp: xyznumbers 
- CAN:          //2 
.. 
timestamp: xyznumbers 
- CAN:          //n 
.. 
timestamp: xyznumbers 

Jeder Anhang hier ist ein Testszenario für CAN.

Logik, die ich geschrieben habe, hängt tatsächlich alles immer wieder an, ich weiß nicht, wie man den erforderlichen Block einfach anhängt.

data = {'__blocks': {}, 
       'messages': 
        {'CANMessages': 
        [ 
         {'DL': 7, 
         'Description': u'%s'%self.Description, 
         'timestamp': current_milli_time, 
         'D3': ['%s'%self.D3], 
         'Period': self.Period, 
         'ID': hex(self.ID), 
         'CAN': u'%s'%self.CAN, 
         'D6': ['%s'%self.D6], 
         'D7': ['%s'%self.D7], 
         'D4': ['%s'%self.D4], 
         'D5': ['%s'%self.D5], 
         'D2': ['%s'%self.D2], 
         'id': 'xxx-xxx-xxx-xxx', 
         'D0': ['%s'%self.D0], 
         'D1': ['%s'%self.D1] 
         } 
         ], 
         'MOSTMessages': []}, 
         'pages': [], 
         'settings': {}}    


     with open(fileMock, 'a') as outfile: 
      outfile.write(yaml.dump(data, default_flow_style=False)) 

Antwort

0

Sie öffnen die Ausgabedatei zum Anhängen (open(fileMock, 'a')) und jedes Mal die gesamte Datenstruktur schreiben. Sie sollten wahrscheinlich a überhaupt nicht für eine YAML-Datei verwenden, es sei denn, Sie möchten mehrere Dokumente in der Datei haben.

Anfügen alle Elemente der Datenstruktur data und es dann noch einmal schreiben, mit:

with open(fileMock, 'w') as outfile: 
     outfile.write(yaml.dump(data, default_flow_style=False)) 

(beachten Sie den 'w' Parameter open()

Alternativ können Sie lesen anhängen, ein Element zu einem Zeit, aber dann müssen Sie die YAML zurück in data, vorzugsweise mit ruamel.yaml.round_trip_load() lesen, um Ihre Schlüsselreihenfolge und das Layout zu erhalten, die neuen Daten an der richtigen Stelle anzuhängen und dann in die YAML - Datei zu speichern (wieder unter open(fileMock, 'w') und nicht open(fileMock, 'a'))

+0

Ja, ich stimme dem zu und akzeptiere dies als echte Antwort. –