Форум сайта python.su
Всем привет!
Есть задача, побить большой json на отдельные файлы более меньшего размера, для удобочитаемости.
import json import os from collections import OrderedDict with open('chaining.json') as tdata: tevents = json.load(tdata) id_event = 1 for event in tevents: if id_event == 2: print('id not equal 1') break path = '{0}_{1}'.format(id_event, event) os.mkdir(path) event_name = '{0}.json'.format(path) path_json = os.path.join(path, event_name) with open(path_json, 'w') as tjson: tevent ={event: tevents[event]} json.dump(tevent, tjson, indent=4, sort_keys=True) id_event += 1
Отредактировано grandfa8 (Март 23, 2017 17:03:07)
Офлайн
grandfa8Не сделаете вы чтобы они не перемешивались. Стандарт json прямо говорит - словарь неупорядоченное множество. Драйверы записи могут записывать данные как хотят в любом порядке. Если нужно сохранить порядок используйте списки.
где больше одного ключа они перемешиваются рандомно
Офлайн
Попробуйте OrderedDict из collections он запоминает порядок добавления ключей
https://docs.python.org/3/library/collections.html#collections.OrderedDict
[code python][/code]
Отредактировано PEHDOM (Март 23, 2017 20:22:55)
Офлайн
>>> import json >>> import collections >>> >>> s = """{"a": 1, "c": 3, "b": 2}""" >>> >>> out = json.loads(s) >>> out {'b': 2, 'c': 3, 'a': 1} >>> >>> >>> def f(arg): ... print(arg) ... >>> json.loads(s, object_pairs_hook=f) [('a', 1), ('c', 3), ('b', 2)] >>> >>> >>> outd = json.loads(s, object_pairs_hook=collections.OrderedDict) >>> outd OrderedDict([('a', 1), ('c', 3), ('b', 2)]) >>> >>> >>> json.dumps(out) '{"b": 2, "c": 3, "a": 1}' >>> >>> json.dumps(outd) '{"a": 1, "c": 3, "b": 2}' >>>
Офлайн
doza_and
Согласен. json приезжает как хочет.
grandfa8
Поэтому можно или просто сделать дополнительный инкрементный ключ для сортировки. Другого варианта предложить сложно. Мало того, все же рассмотрите вариант, когда передается не словарь, а все-таки список со словарями внутри, где каждый словарь фактически Ваше поле.
Офлайн
4kpt_VТам можно напрямую читать, как оно записано в файле.
Согласен. json приезжает как хочет.
Офлайн
py.user.next
А Вы уверены, что всегда на стороне клиента это упаковывается как подается?
Офлайн
4kpt_VДа можно и на стороне клиента то же самое сделать. У него вопрос так и не стоял, что там на стороне клиента. Он спросил, можно ли туда-сюда провести изменения json-файла, сохраняя порядок всего. Бывают программы, где для красивости определённый порядок больше подходит. Сам формат хранения это не нарушает и возможность сделать такое есть.
А Вы уверены, что всегда на стороне клиента это упаковывается как подается?
Офлайн
Это противоречит формату. Как-бы не логично. Хотя желание и может возникать. Просто когда на другой стороне что-то поменяется то на этой будет писец адовый. Потому как когда на той стороне меняли, то не знали, что оказывается json могут использовать для последовательного хранения. Потому как сама спецификация говорит об обратном…
Отредактировано 4kpt_V (Март 24, 2017 14:51:53)
Офлайн
Да он может и внутренне использоваться, многие программы используют его внутренне (вместо xml). qutIM, Sublime Text. А на другой стороне может стоять точно такая же программа, поддерживающая упорядоченность. И ещё человек может влазить руками (наверное, для этого упорядоченность и нужна, чтобы человек не путался).
Отредактировано py.user.next (Март 25, 2017 00:56:50)
Офлайн