Estrange behavior reading JSON files in Python 3.3
本问题已经有最佳答案,请猛点这里访问。
我使用"json"包读取json文件并转换为csv。几个月前,我用python 2.7编写了一个脚本,它提取了一个包含JSON文件中对象名称的字典(当时它工作得很好)。当我在python 3.3中运行脚本时,每次执行脚本时,检索对象的顺序是不同的。
知道为什么会这样吗?如何修复?
我的脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 | import json import csv input_file = open('my_path\\json_file', 'r') myjson = json.load(input_f) input_f.close() new_json = myjson['markers'] #main object containing sub-objects keys = {} #empty dictionary to store list of sub-objects for i in new_json: for k in i.keys(): keys[k] = 1 |
一些输出示例:
执行1:
1 | KEYS{'': 1, 'latitude': 1, 'Particles': 1, 'Wind Speed': 1, 'image': 1, 'Humidity': 1, 'C/ Daoiz y Velarde': 1, 'Noise': 1, 'Battery level': 1, 'id': 1, 'Soil Moisture': 1, ....} |
号
执行2:
1 | KEYS{'': 1, 'Relative humidity': 1, 'N02': 1, 'Particles': 1, 'Rainfall': 1, 'image': 1, 'Odometer': 1, 'Co Index': 1, 'Wind Direction': 1, 'Atmospheric Pressure': 1, ....} |
这就是字典现在在Python3中的工作方式。这是2.x中默认禁用的安全修补程序的结果。有关详细说明,请参阅此答案。
您可以通过使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import json import csv import collections input_file = open('my_path\\json_file', 'r') myjson = json.load(input_f, object_pairs_hook=collections.OrderedDict) input_f.close() new_json = myjson['markers'] #main object containing sub-objects keys = collections.OrderedDict() for i in new_json: for k in i.keys(): keys[k] = 1 |
号
这是因为不能保证对python字典进行排序。使用ordereddict修复它:
1 2 3 4 5 6 7 8 9 10 11 12 | import json import csv from collections import OrderedDict input_file = open('my_path\\json_file, 'r') myjson = OrderedDict(json.load(input_f)) input_f.close() keys = {} #empty dictionary to store list of sub-objects for i in new_json: for k in i.keys(): keys[k] = 1 |