繁体   English   中英

将 Python 列表转换为 JSON 文档

[英]Convert Python list to JSON document

上下文:我有一个结构如下的列表。 它可以包含可变数量的项目,为 3 的倍数。我试图将每组 3 转换为一个单独的 JSON 文档。

['SCAN1.txt', 'Lastmodified:20191125.121049', 'Filesize:7196', 'SCAN2.txt', 'Lastmodified:20191125.121017', 'Filesize:3949', 'SCAN3.txt', 'Lastmodified:20191125.121056', 'Filesize:2766']

问题:如何将单个列表转换为具有以下格式的 JSON 文档,同时还允许它可以容纳的文件数量发生变化:

{  
  {  
    "File": {  
      "File_Name":"SCAN1.txt",  
      "Last_Modified":"20191125.121049",
      "File_Size":"7196"  
    } 
  {  
    "File": {  
      "File_Name":"SCAN2.txt",  
      "Last_Modified":"20191125.121017",
      "File_Size":"3949"  
    } 
  }
  {  
    "File": {  
      "File_Name":"SCAN3.txt",  
      "Last_Modified":"20191125.121056",
      "File_Size":"2766"  
    }
  } 
}

使用来自 more-itertools 的分块

    from more_itertools import chunked
    import json

    example = ['SCAN1.txt', 'Lastmodified:20191125.121049', 'Filesize:7196', 'SCAN2.txt', 'Lastmodified:20191125.121017', 'Filesize:3949', 'SCAN3.txt', 'Lastmodified:20191125.121056', 'Filesize:2766']

    def file_to_json(file):
        return {"File": {"File_Name": file[0], "Last_Modified": file[1], "File_Size": file[2]}} 

    json.dumps([file_to_json(file) for file in list(chunked(example, 3))])

输出:

        [{
        "File": {
            "File_Name": "SCAN1.txt",
            "Last_Modified": "Lastmodified:20191125.121049",
            "File_Size": "Filesize:7196"
        }
    }, {
        "File": {
            "File_Name": "SCAN2.txt",
            "Last_Modified": "Lastmodified:20191125.121017",
            "File_Size": "Filesize:3949"
        }
    }, {
        "File": {
            "File_Name": "SCAN3.txt",
            "Last_Modified": "Lastmodified:20191125.121056",
            "File_Size": "Filesize:2766"
        }
    }]

您还可以更改结果以将文件名作为键,因为它们是唯一的:

{
    "SCAN1.txt": {
        "Filesize": 7196,
        "Lastmodified": 20191125.121049
    },
    "SCAN2.txt": {
        "Filesize": 3949,
        "Lastmodified": 20191125.121017
    },
    "SCAN3.txt": {
        "Filesize": 2766,
        "Lastmodified": 20191125.121056
    }
}

可以像下面那样实现(包括评论):

from collections import defaultdict
from json import dumps
from ast import literal_eval

lst = [
    "SCAN1.txt",
    "Lastmodified:20191125.121049",
    "Filesize:7196",
    "SCAN2.txt",
    "Lastmodified:20191125.121017",
    "Filesize:3949",
    "SCAN3.txt",
    "Lastmodified:20191125.121056",
    "Filesize:2766",
]


def group_file_documents(lst, prefix="SCAN"):
    # Use defaultdict of dicts to represent final JSON structure
    # Also can be serialized like normal dictionaries
    result = defaultdict(dict)

    current_file = None
    for item in lst:

        # Update current file name if starts with prefix
        if item.startswith(prefix):
            current_file = item
            continue

        # Ensure current file name is present
        if current_file:

            # Split key.values and strip whitespace, just in case
            key, value = map(str.strip, item.split(":"))

            # Convert to actual int/float value
            result[current_file][key] = literal_eval(value)

    return result

# Print serialized JSON file with sorted keys and indents of 4 spaces
print(dumps(group_file_documents(lst), sort_keys=True, indent=4))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM