2016-07-07 17 views
3

Ich möchte die Kommentarzeichenfolgen aus einer YAML-Datei erhalten, die ich mit ruamel.yaml geladen habe. Der project documentation fehlt eine API-Referenz und ich kann kein relevantes Beispiel finden. Was ist der richtige Weg, um auf die Kommentare zuzugreifen?Wie kann ich Kommentare aus einer YAML-Datei mit ruamel.yaml in Python erhalten?

import ruamel.yaml 

yaml = """\ 
%YAML 1.2 
--- 
# C1 
a: # C2 
    # C3 
    # C4 
    b: 1 # C5 
    c: # A comment here will not be parsed properly by ruamel.yaml v0.11.14 
    - abC# C6 
    - xyz # C7 
    # C8 
# C9 
""" 

loaded = ruamel.yaml.round_trip_load(yaml) 

# Now what? 
+1

Es ist in der Tat noch nicht möglich auf einer Linie Kommentar zu haben, die nur einen Schlüssel hat und richtig bewahren Das. Dies ist einer der Gründe, warum es keine API gibt, da "ruamel.yaml" vollständiger sein sollte (einschließlich der Unterstützung dieser seltenen Fälle, für die sich die zugrunde liegende Datenstruktur ändern sollte). Der Kommentarspeicher benötigt auch aussagekräftige Attributnamen anstelle von Listenindizes (in einer verschlüsselten Reihenfolge). 'ruamel.yaml' sollte mehr von PyYAMLs Legacy loswerden und Kommentar-Runden-Trips sollten auch funktionieren, wenn die C-basierten Parser-Stufen verwendet werden. – Anthon

+1

Und dann gibt es natürlich das Problem zu entscheiden, ob ein Kommentar zu einer eigenen Zeile zu dem vorherigen Skalar gehört oder zum nächsten usw. – Anthon

Antwort

1

Die Bibliothek Autor Kommentare zu diesem Thema in an issue on BitBucket (9. Mai 2016):

Der Kommentar Erhaltung nicht stabilisiert hat, z.B. Ich muss etwas tun, wenn sich der Schlüssel und der Wert eines Mappings nicht in derselben Zeile befinden und der Schlüssel (oder sowohl der Schlüssel als auch der Wert) einen Kommentar haben. Und mein ursprüngliches Ziel war die Erhaltung bestehender Kommentare, nicht so sehr die Manipulation.

Durch einige Experimente bestimmen ich folgende Arbeiten für das Codebeispiel in der Frage oben zu finden:

print('Comment 1: ' + loaded.ca.comment[1][0].value) 
print('Comment 2: ' + loaded.ca.items['a'][2].value) 
print('Comment 3: ' + loaded.ca.items['a'][3][0].value) 
print('Comment 4: ' + loaded.ca.items['a'][3][1].value) 
print('Comment 5: ' + loaded['a'].ca.items['b'][2].value) 
print('Comment 6: ' + loaded['a']['c'].ca.items[0][0].value) 
print('Comment 7: ' + loaded['a']['c'].ca.items[1][0].value) 
print('Comment 8: ' + loaded['a']['c'].ca.end[0].value) 
print('Comment 9: ' + loaded['a']['c'].ca.end[1].value) 
+0

Ja, im Allgemeinen, wenn Sie ein Mapping/dict Objekt haben, benutzen Sie 'ca .items [Schlüssel], um die mit dem Schlüssel verknüpften Kommentare zu erhalten, und ähnlich für Sequenzen/Listen verwenden Sie 'ca.items [index]' für ein bestimmtes Element. Die Manipulation in '_test/test_comment_manipulation.py' könnte weitere Hinweise geben, wie neue Kommentare gesetzt werden können. – Anthon