我编写了一个函数来获取excel列并将它们放入字典中以输出到json中。当我写json输出时,键值似乎是随机排序的。有没有办法可以按照我添加它们的顺序强制执行键值?
def excel_to_json(filename):
wb = xlrd.open_workbook(filename)
sh = wb.sheet_by_index(0)
# List to hold dictionaries
c_list = []
# Iterate through each row in worksheet and fetch values into dict
for rownum in range(1, sh.nrows):
cars = OrderedDict()
row_values = sh.row_values(rownum)
cars['Name'] = row_values[0]
cars['Extensions'] = row_values[1]
cars['Patterns'] = row_values[2]
cars['RansomNoteFilenames'] = row_values[3]
cars['Comment'] = row_values[4]
cars['EncryptionAlgorithm'] = row_values[5]
cars['AlternateNames'] = row_values[6]
cars['Decryptor'] = row_values[7]
cars['AdditionalInfo1'] = row_values[8]
cars['AdditionalInfo2'] = row_values[9]
cars['Screenshots'] = row_values[10]
c_list.append(cars)
# Serialize the list of dicts to JSON
return formatJson(json.dumps(c_list))
def formatJson(input):
return json.dumps(json.loads(input), indent=4)
示例json输出如下所示:
{
"Name": "dummydata",
"Comment": "",
"AlternateNames": "",
"Screenshots": "dummydata",
"RansomNoteFilenames": "dummydata",
"Decryptor": "",
"Extensions": "dummydata",
"AdditionalInfo2": "",
"Patterns": "",
"EncryptionAlgorithm": "dummydata",
"AdditionalInfo1": "dummydata",
},
正如您所看到的,这里的键与excel_to_json()
中的for循环的顺序不同,这使得json的可读性在手动处理时很难。
答案 0 :(得分:1)
这样做
def formatJson(inp):
return json.dumps(inp, indent=4)
并称之为
formatJson(c_list)
您正在倾倒并再次加载它。
您的代码也略有改进
for rownum in range(1, sh.nrows):
cars = OrderedDict()
row_values = sh.row_values(rownum)
row_names = ['Name','Extensions','Patterns','Comment',....]
for i in range(len(row_values)):
cars[row_names[i]] = row_values[i]
c_list.append(cars)
答案 1 :(得分:1)
这取决于您使用的json
序列化程序是否真正遵守OrderedDict
中的订单。你可以尝试另一个(例如simplejson
)并查看它是否有效。它们都是API兼容的。
此外,大多数json.dumps
实现都有一个sort_keys
参数,它将按字母顺序对所有键进行排序。当您希望拥有数据的稳定表示时,这非常有用,例如:差异等等。
P.S。
此外,如果您使用内置zip
内容,则可以使代码更加简单。
columns = ['Name', 'Extension', 'Patterns']
row = ['Foo', 'Bar', 'Baz']
OrderedDict(zip(columns, row))
给出
OrderedDict([('Name', 'Foo'), ('Extension', 'Bar'), ('Patterns', 'Baz')])