Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何避免字典项随机排序键?_Python_Json_Dictionary - Fatal编程技术网

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

Python 如何避免字典项随机排序键?,python,json,dictionary,Python,Json,Dictionary,我编写了一个函数,用于获取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 thr

我编写了一个函数,用于获取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\u to_json()
中的for循环顺序不同,这使得手动处理json时很难读取。

这样做

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)
这样做

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)

这取决于您使用的
json
序列化程序是否实际遵守
orderedict
中的顺序。您可以尝试另一个(例如,
simplejson
),看看它是否有效。它们都是API兼容的

此外,大多数
json.dump
实现都有一个
sort\u keys
参数,该参数将按字母顺序对所有键进行排序。当您希望数据有一个稳定的表示形式时,这是非常有用的,例如,差分等

p、 美国

此外,如果使用
zip
内置代码,您的代码可以变得更加简单

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


这取决于您使用的
json
序列化程序是否实际遵守
orderedict
中的顺序。您可以尝试另一个(例如,
simplejson
),看看它是否有效。它们都是API兼容的

此外,大多数
json.dump
实现都有一个
sort\u keys
参数,该参数将按字母顺序对所有键进行排序。当您希望数据有一个稳定的表示形式时,这是非常有用的,例如,差分等

p、 美国

此外,如果使用
zip
内置代码,您的代码可以变得更加简单

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


您已经在使用
OrderedDict
。为什么要再次转换为json?在formatJson函数中,您正在再次加载它(dict的字符串),这会导致问题OOOPS-删除…顺便说一句,您不应该使用
input
作为变量名,因为这会影响内置的
input
函数。@PM2Ring谢谢您,好建议!您已经在使用
OrderedDict
。为什么要再次转换为json?在formatJson函数中,您正在再次加载它(dict的字符串),这会导致问题OOOPS-删除…顺便说一句,您不应该使用
input
作为变量名,因为这会影响内置的
input
函数。@PM2Ring谢谢您,好建议!