Seite 1 von 1

yaml.load sortiert ungewollt alphabetisch

Verfasst: Dienstag 5. September 2017, 13:39
von nieselfriem
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

Re: yaml.load sortiert ungewollt alphabetisch

Verfasst: Dienstag 5. September 2017, 13:57
von noisefloor
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

Re: yaml.load sortiert ungewollt alphabetisch

Verfasst: Dienstag 5. September 2017, 15:54
von nieselfriem
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

Re: yaml.load sortiert ungewollt alphabetisch

Verfasst: Dienstag 5. September 2017, 16:03
von __deets__
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.

Re: yaml.load sortiert ungewollt alphabetisch

Verfasst: Dienstag 5. September 2017, 17:23
von snafu
Schau dir mal die Beispiele von ruamel.yaml an:
http://yaml.readthedocs.io/en/latest/example.html
Vielleicht hilft dir das weiter.

Re: yaml.load sortiert ungewollt alphabetisch

Verfasst: Dienstag 5. September 2017, 19:13
von noisefloor
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

Re: yaml.load sortiert ungewollt alphabetisch

Verfasst: Mittwoch 6. September 2017, 12:04
von Zizibee
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'}
>>>

Re: yaml.load sortiert ungewollt alphabetisch

Verfasst: Mittwoch 6. September 2017, 12:15
von kbr
@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.

Re: yaml.load sortiert ungewollt alphabetisch

Verfasst: Mittwoch 6. September 2017, 12:30
von Zizibee
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.