Я хочу, чтобы сохранить порядок 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. Смотрите http://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))