yaml.load sortiert ungewollt alphabetisch

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
Benutzeravatar
nieselfriem
User
Beiträge: 135
Registriert: Sonntag 13. Januar 2013, 16:00

Hallo Ich habe folgende yaml-Datei

[codebox=yaml file=Unbenannt.yml]
# Server settings
server:
port: 40011
management:
port: 41011

# Logging
logging:
level:
de.testprojekt.de: TRACE

#Connection-Infs
connection:
host: test-host
properties:
connection-timeout-ms: 10000
socket-timeout-ms: 60000
basic-auth:
name: benutzer
pass: passwort123

# Actuator settings
info:
app:
name: project.artifactId
version: project.version
security:
user:
name: testuser
password: dsfklmsdklfsdklfmsdklfm
[/code]

Diese Datei lade ich wie folgt:

Code: Alles auswählen

    with open(filepath, 'r') as file_descriptor:
        data = yaml.load(file_descriptor)
    print data
Nun ist aber der Haken, dass schon beim Laden die Inhalte alphabetisch in das Dictionary sortiert werden. Das ist jedoch nicht gewollt.

[codebox=text file=Unbenannt.txt]{'info': {'app': {'version': 'project.version', 'name': 'project.artifactId'}}, 'management': {'port': 41011}, 'logging': {'level': {'de.testprojekt.de': 'TRACE'}}, 'connection': {'host': 'https://test-host', 'basic-auth': {'name': 'benutzer', 'pass': 'passwort123'}, 'properties': {'socket-timeout-ms': 60000, 'connection-timeout-ms': 10000}}, 'security': {'user': {'password': 'dsfklmsdklfsdklfmsdklfm', 'name': 'testuser'}}, 'server': {'port': 40011}}
[/code]

Das ähnliche Thema gib es ja bein schreiben von yaml-Files mit yaml.dump und dazu habe ich folgenden Link gefunden: https://codedump.io/share/2MLFLtw3wnX7/ ... ical-order . Da ich aber ungewollt ein sortiertes Dictionary erzeuge, müsste das Problem erst einmal beim Laden behoben werden und funktioniert leider nicht mit dem Workaraound im link.

Hat jemand eine Idee, wie dich das Problem lösen könnte?

VG niesel
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

eherlich gesagt: ich sehe da keine alphabetische Sortierung...

Abgesehen davon: wieso ist die apphabeitsche Sortierung denn ein Problem? Du greifst auf das Dict doch so wie so mittels Schlüssel und nicht mittels Index zu. Von daher ist die Reihenfolge doch egal...,

Von welchem Typ ist denn `data`? Wenn's wirklich ein Python-Dict ist, ist die Reihenfolge der Schlüssel so wie so zufällig und nicht reproduzierbar.

Gruß, noisefloor
Benutzeravatar
nieselfriem
User
Beiträge: 135
Registriert: Sonntag 13. Januar 2013, 16:00

Nun gut, eine richtige alphabetische Ordnung ist es nicht. Jedoch habe ich das Problem, dass es sich um eine config-Datei einer Anwendung handelt und wir gerne die von den Entwicklern gelieferte Formatierung behalten wollen. Aus diesem Grund, ist es schon etwas nervig, dass die Struktur irgendwie willkürlich geändert wird. Sicherlich sollte es keine funktionale Problematik sein. Wenn man jedoch die eigene Datei mit denen von der Entwicklung gelieferten vergleichen möchte, dann nervt das schon etwas.

VG niesel
__deets__
User
Beiträge: 14540
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das Problem ist ganz einfach: Woerterbuecher kennen keine Ordnung. Wer das will, muss explizit zB ein ordereddict verwenden.

Wenn PyYAML das nicht unterstuetzt (ich hab' auf die schnelle nix gefunden, finde die Doku aber auch sehr unuebersichtlich), dann bleibt euch fuer den Vergleich nur ein smarteres diffing zu betreiben, bei dem ihr halt nicht die zwei Dateien vergleicht, sondern die zwei Datenstrukturen.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Schau dir mal die Beispiele von ruamel.yaml an:
http://yaml.readthedocs.io/en/latest/example.html
Vielleicht hilft dir das weiter.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Aus diesem Grund, ist es schon etwas nervig, dass die Struktur irgendwie willkürlich geändert wird.
Natürlich ändert sich die Struktur - du überführst ja nun man eine YAML-Datei in eine Python-Objekt...
Wenn man jedoch die eigene Datei mit denen von der Entwicklung gelieferten vergleichen möchte, dann nervt das schon etwas.
Warum vergleichst du eigentlich nicht direkt die YAML-Dateien, sondern willst das erst in eine Python-Objekt überführen?

Gruß, noisefloor
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Die Sortierung kommt wohl nicht von yaml.load. Das macht das Dictionary von ganz alleine:

Code: Alles auswählen

>>> dict = {5 : 'fuenf', 4 : 'vier', 8 : 'acht'}
>>> dict
{8: 'acht', 4: 'vier', 5: 'fuenf'}
>>>
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@Zizibee: Python-Dictionaries sind unsortiert. Eventuell sortierte Einträge wären rein zufällig. Abhilfe schafft collections.OrderedDict oder (inoffiziell) Python 3.6. Dort bleibt in Dictionaries die Reihenfolge gewahrt, mit der key-value Paare hinzugefügt werden.

Noch ein Hinweis: mit 'dict' als Label überschreibst Du die gleichnamige buildin-Funktion zur Erzeugung von Dictionaries. Kannst Du auch schön an der grünen Syntaxeinfärbung erkennen.
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

kbr hat geschrieben:@Zizibee: Python-Dictionaries sind unsortiert. Eventuell sortierte Einträge wären rein zufällig.
Genau das wollte ich dem TE damit verdeutlichen, aber das war wohl schlecht ausgedrückt.
kbr hat geschrieben:Noch ein Hinweis: mit 'dict' als Label überschreibst Du die gleichnamige buildin-Funktion zur Erzeugung von Dictionaries. Kannst Du auch schön an der grünen Syntaxeinfärbung erkennen.
Oh, das war natürlich nicht beabsichtigt, danke für den Hinweis.
Antworten