为了账号安全,请及时绑定邮箱和手机立即绑定

Python 按名称对包含大量数组的 JSON 文件进行排序

Python 按名称对包含大量数组的 JSON 文件进行排序

犯罪嫌疑人X 2024-01-24 21:00:42
我有一个 JSON 文件,看起来像这样,只有一个元素:[    {        "test1": [            {                "checked": [                    "True"                ],                "description": [                    "asdasd"                ],                "fileName": [                    "GT-002"                ],                "imgLoc": [                    "/Images/GT-002.png"                ],                "material": [                    6                ],                "quantity": [                    1                ]            }        ]    }]我需要某种方法来对我的大型 JSON 文件进行排序fileName。现在它所做的一切都很奇怪和随机,对我来说没有任何作用。test1并test具有相同数量的项目,但NON_BATCH例如有更多的项目,并且当它们分开时我找不到任何方法对它们进行正确排序。我尝试过以下代码:import jsonData_JSON = 'data.json'BATCH_NAME = 'NON_BATCH'with open(Data_JSON) as file:    Data_JSON_Contents = json.load(file)    sortedList = sorted(Data_JSON_Contents, key=lambda i: i[BATCH_NAME][0]['fileName'])    with open(Data_JSON, mode='w+', encoding='utf-8') as file:        json.dump(sortedList, file, ensure_ascii=True, indent=4, sort_keys=True)如果有人知道任何工具或库或执行此操作的正确方法,我真的很感激,我已经尝试过natsort以下方法:from natsort import natsort_keygennatsort_key = natsort_keygen()Data_JSON_Contents[0][BATCH_NAME][0].sort(key=natsort_key)或者类似的东西,但对我来说没有任何作用。
查看完整描述

1 回答

?
森林海

TA贡献2011条经验 获得超2个赞

我设法将所有内容合并到一个元组中,然后使用 对其进行排序natsort,然后将其“缝合”在一起,从而成功地缝合了一个解决方案。


这是代码:


import json

from natsort import natsort_keygen

natsort_key = natsort_keygen()


Data_JSON = 'data.json'

BATCH_NAME = 'NON_BATCH'


file_names = []

image_locations = []

quantities = []

description = []

checkmarked = []

materials = []


def merge(*args):

    return [(args[0][i], args[1][i], args[2][i], args[3][i], args[4][i], args[5][i]) for i in range(len(args[0]))]


with open(Data_JSON) as file:

    Data_JSON_Contents = json.load(file)


    for item in Data_JSON_Contents[0][BATCH_NAME]:

        file_names.append(item['fileName'][0])

        image_locations.append(item['imgLoc'][0])

        quantities.append(item['quantity'][0])

        description.append(item['description'][0])

        checkmarked.append(item['checked'][0])

        materials.append(item['material'][0])


    merged = sorted(merge(file_names, image_locations, quantities,

                          description, checkmarked, materials), key=natsort_key)


    for i, j in enumerate(file_names):

        Data_JSON_Contents[0][BATCH_NAME].pop(0)

        Data_JSON_Contents[0][BATCH_NAME].append({

            'fileName': [merged[i][0]],

            'imgLoc': [merged[i][1]],

            'quantity': [int(merged[i][2])],

            'description': [merged[i][3]],

            'checked': [merged[i][4]],

            'material': [merged[i][5]]

        })

    with open(Data_JSON, mode='w+', encoding='utf-8') as file:

        json.dump(Data_JSON_Contents, file,

                  ensure_ascii=True, indent=4)



无论如何,它都不是简洁的代码,也不是经过优化的,但它是有效的,如果有人有一些建议可以让它变得更好、更“时尚”,我会非常乐意使用它。



查看完整回答
反对 回复 2024-01-24
  • 1 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信