Я хочу сохранить порядок OrderedDict с ujson


Тип возвращаемого значения моей функции - OrderedDict,

А теперь я хочу записать это в файл:

Вот мой код:

mainDict = OrderedDict([('a',1),('b',2),('c',3),('d',[4,5,6])])
with open(outFileName, 'w', encoding='utf-8') as outFile :
   outFile.write(ujson.dumps(mainDict, indent=4))
Я ожидал, что он сохранит порядок словаря в файле, но он перепутался.

Это из-за использования ujson.dumps? и как я могу сохранить порядок OrderedDict в выходном файле?

3 2

3 ответа:

Использовать sort_keys параметр ujson.dumps

Поведение ujson выглядит следующим образом:

  • sort_keys=None (по умолчанию, если опущено) - дамп ключей dict в определенном реализацией порядке, который может отличаться при каждом запуске (но это быстро)
  • sort_keys=True - сортировка ключей dict перед дампом
  • sort_keys=False - сохранение порядка ключей dict, предусмотренного dict.items()
Таким образом, чтобы сохранить порядок OrderedDict с ujson, вам нужно sort_keys=False.

Тесты

Вот как вы можете проверить это:

import sys
import ujson

order = None
if len(sys.argv) == 2:
    order = bool(int(sys.argv[1]))

mainDict = OrderedDict([('c',3),('b',2),('a',1)])
sys.stdout.write(ujson.dumps(mainDict, sort_keys=order))

Тесты:

$ python order.py      # sort_keys=None
{"c":3,"a":1,"b":2}

$ python order.py      # sort_keys=None
{"b":2,"c":3,"a":1}

$ python order.py 1    # sort_keys=True
{"a":1,"b":2,"c":3}

$ python order.py 0    # sort_keys=False
{"c":3,"b":2,"a":1}

Примечания

Обратите внимание, что в отличие от ujson, встроенный модуль json сохраняет порядок Ключей с sort_keys=None, а также с sort_keys=False.

Также обратите внимание, что, хотя можно сохранить порядок Ключей с помощью этих реализаций (ujson и json), это нестандартный JSON. Смотрите json.org:

Объект-этонеупорядоченный набор пар имя/значение.

Используйте вот так

mainDict = OrderedDict([('a',1),('b',2),('c',3),('d',[4,5,6])])
with open(outFileName, 'w', encoding='utf-8') as outFile :
   outFile.write(ujson.dumps(mainDict, indent=4, sort_keys=False))

Да, похоже, что ujson по умолчанию сбрасывает словарь как неупорядоченный словарь, в отличие от встроенного пакета json. Задайте аргументу sort_keys Значение true для сброса данных в виде упорядоченного словаря.

Вот мой пример кода:

import ujson
import json
from collections import OrderedDict

mainDict = OrderedDict([('a',1),('b',2),('c',3),('d',[4,5,6])])

# Maintain the ordering of dictionary upon dump.
with open("ordereddict2.txt", 'w') as outFile :
  outFile.write(ujson.dumps(mainDict, indent=4, sort_keys=True))