【问题标题】:Python sort JSON file with lots of arrays by namePython 按名称对包含大量数组的 JSON 文件进行排序
【发布时间】:2021-02-11 11:38:06
【问题描述】:

我有一个带有一个元素的 JSON 文件:

[
    {
        "test1": [
            {
                "checked": [
                    "True"
                ],
                "description": [
                    "asdasd"
                ],
                "fileName": [
                    "GT-002"
                ],
                "imgLoc": [
                    "/Images/GT-002.png"
                ],
                "material": [
                    6
                ],
                "quantity": [
                    1
                ]
            }
        ]
    }
]

我需要一些方法来按fileName 对我的大型 JSON 文件进行排序。现在它做的一切都很奇怪和随机,对我没有任何作用。

test1test 具有相同数量的项目,但 NON_BATCH 例如有更多,当它们分开时我找不到任何方法来正确排序。

我已经尝试了以下代码:

import json

Data_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_keygen
natsort_key = natsort_keygen()
Data_JSON_Contents[0][BATCH_NAME][0].sort(key=natsort_key)

或者类似的东西,但对我没有任何作用。

data.json

[{"NON_BATCH": [{"checked": ["True"], "description": [""], "fileName": ["GT-003"], "imgLoc": ["/Images/GT-003.png"], "material": [0], "quantity": [1]}, {"checked": ["False"], "description": [""], "fileName": ["GT-005"], "imgLoc": ["/Images/GT-005.png"], "material": [0], "quantity": [1]}, {"checked": ["True"], "description": [""], "fileName": ["GT-013"], "imgLoc": ["/Images/GT-013.png"], "material": [0], "quantity": [1]}, {"checked": ["False"], "description": [""], "fileName": ["GT-006"], "imgLoc": ["/Images/GT-006.png"], "material": [0], "quantity": [1]}, {"checked": ["True"], "description": [""], "fileName": ["GT-007"], "imgLoc": ["/Images/GT-007.png"], "material": [0], "quantity": [1]}, {"checked": ["False"], "description": [""], "fileName": ["GT-012"], "imgLoc": ["/Images/GT-012.png"], "material": [0], "quantity": [1]}, {"checked": ["True"], "description": [""], "fileName": ["GT-009"], "imgLoc": ["/Images/GT-009.png"], "material": [0], "quantity": [1]}, {"checked": ["False"], "description": [""], "fileName": ["GT-004"], "imgLoc": ["/Images/GT-004.png"], "material": [0], "quantity": [1]}, {"checked": ["True"], "description": [""], "fileName": ["GT-008"], "imgLoc": ["/Images/GT-008.png"], "material": [9], "quantity": [1]}, {"checked": ["False"], "description": [""], "fileName": ["GT-010"], "imgLoc": ["/Images/GT-010.png"], "material": [6], "quantity": [1]}], "test": [{"checked": ["False"], "description": ["asdsad"], "fileName": ["GT-001"], "imgLoc": ["/Images/GT-001.png"], "material": [11], "quantity": [1]}], "test1": [{"checked": ["True"], "description": ["asdasd"], "fileName": ["GT-002"], "imgLoc": ["/Images/GT-002.png"], "material": [6], "quantity": [1]}]}]

【问题讨论】:

  • 你为什么使用 natsort?此处显示的数据似乎不需要自然排序。
  • 我想我会试试看我是否“可以”使用它,我没有使用它。我刚试过。
  • 好的,仅供参考,您的输入数据已经排序。
  • 我的数据不是按fileName 排序的,例如,在NON_BATCH 中,第三个元素('GT-013')应该在该部分的末尾。不在顶部附近。

标签: python json sorting


【解决方案1】:

我设法将所有内容合并到一个元组中,然后使用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)


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 2021-11-03
    相关资源
    最近更新 更多