[英]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.