Py学习  »  Python

将Python列表转换为JSON文档

emalcolmb • 4 年前 • 688 次点击  

上下文: 我有一份清单,结构如下。它可以包含可变数量的项,以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"  
    }
  } 
}
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/50991
 
688 次点击  
文章 [ 3 ]  |  最新文章 4 年前
ycao
Reply   •   1 楼
ycao    4 年前

因为 json.dumps 只能收集字典,因此必须编写代码才能将其转换为 Dict() 反对。

roadrunner
Reply   •   2 楼
roadrunner    4 年前

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

{
    "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))
aviboy2006 Kent Shikama
Reply   •   3 楼
aviboy2006 Kent Shikama    4 年前

使用 chunked 从更多的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"
        }
    }]