如何避免字典项随机排序键?

2024-04-27 00:46:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经编写了一个函数来获取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的可读性变得困难。你知道吗


Tags: toinjsonfordefshfilenamecars
2条回答

这取决于您使用的json序列化程序是否真正遵守OrderedDict中的顺序。您可以尝试另一种方法(例如simplejson),看看是否有效。它们都是API兼容的。你知道吗

而且,大多数json.dumps实现都有一个sort_keys参数,它将按字母顺序对所有键进行排序。当您想对数据进行稳定的表示时,这是很有用的,例如差分等

附言

另外,如果使用zip内置代码,代码也会变得简单得多。你知道吗

columns = ['Name', 'Extension', 'Patterns']
row = ['Foo', 'Bar', 'Baz']
OrderedDict(zip(columns, row))

给予

OrderedDict([('Name', 'Foo'), ('Extension', 'Bar'), ('Patterns', 'Baz')])

做这个

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)

相关问题 更多 >