Я хочу сохранить порядок 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 ответа:
Использовать
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))