【python - load json 解析问题】json格式特别留意“,“逗号!! 要不容易解析出问题
通过py脚本读取json文件,再根据指定的key去删除文件夹内的相应packages文件夹。
·
背景
通过py脚本读取json文件,再根据指定的key去删除文件夹内的相应packages文件夹
代码实现
import json
import os
import shutil
"""
该脚本是针对avatar 资源设计的
主要是对avatar的package 资源做筛选;
仅保留json文件中所需要的packageID 和 id 所指向的package资源;
jsonPath 是 avatar 的 资源json 路径
path 是 需要删除package资源的主路径
"""
class AvatarAssetsHandler(object):
def __init__(self, path, jsonPath):
self.path = path
self.jsonPath = jsonPath
def read_json(self, jsonPath):
"""
读取文件,获取一个jsonString文本
:param jsonPath:
:return: json文本
"""
with open(jsonPath, 'r') as patch_file:
content = patch_file.read()
return content
def delete(self, path):
"""
删除一个文件/文件夹
:param path: 待删除的文件路径
:return:
"""
if not os.path.exists(path):
print("[*] {} not exists".format(path))
return
if os.path.isdir(path):
shutil.rmtree(path)
elif os.path.isfile(path):
os.remove(path)
elif os.path.islink(path):
os.remove(path)
else:
print("[*] unknow type for: " + path)
def json_value_find(self, json_data, target_key):
"""
在json文本中查找指定的key的value数值
:param json_data:json字符串文本
:param target_key:指定的key
:return:values的list数据结构
"""
def iter_node(node_data):
if isinstance(node_data, dict):
key_value_iter = (x for x in node_data.items())
elif isinstance(node_data, list):
key_value_iter = (x for x in enumerate(node_data))
else:
return
for key, value in key_value_iter:
if key == target_key:
yield value
if isinstance(value, (dict, list)):
yield from iter_node(value)
dict_data = json.loads(json_data)
return list(iter_node(dict_data))
def delete_all_unuseful_files(self, source_demo_root_path, keyList):
print("delete_all_unuseful_files")
if keyList is None:
keyList = []
"""
在删除所有的不需要的avatar中packages文件
一般这些avatar资源都是在Packages文件内
通过os.walk进行遍历判断并delete删除
:param source_demo_root_path: 指定目录下
:return:
"""
for current_folder, dirs, files in os.walk(source_demo_root_path, topdown=True):
# current_folder 表示当前正在访问的文件夹路径
# dirs 表示该文件夹下的子目录名list
# files 表示该文件夹下的文件list
# 遍历文件
# for f in files:
# print(os.path.join(current_folder, f))
if current_folder.endswith("Packages"):
print(current_folder)
for filename in dirs:
print(filename)
if filename not in keyList:
exist_test_folder = os.path.join(current_folder, filename)
print(exist_test_folder)
if os.access(exist_test_folder, os.F_OK):
self.delete(exist_test_folder)
print("delete_all_unuseful_files:" + exist_test_folder)
def startDel(self):
jsonContent = handler.read_json(self.jsonPath)
keyList = self.json_value_find(jsonContent, "id")
newList = self.json_value_find(jsonContent, "packageID")
keyList.extend(newList)
print(keyList)
self.delete_all_unuseful_files(self.path, keyList)
if __name__ == '__main__':
"""
不同项目的路径不一样!!!
在每次拷贝avatar的asset资源,
需要进行筛选的时候记得更新文件path(重要,重要,重要)
"""
jsonPath = "xxxxx.json"
path = "xxxx/assets"
# 直接执行删除文件
handler = AvatarAssetsHandler(path, jsonPath)
handler.startDel()
遇阻
遇到这样的问题SyntaxError: Unexpected token ']', ...", ] },"... is not valid JSON
结果发现是","逗号,多了,导致这个json解析还以为后面有数据,结果取出来就是个]罢了!
最后删除json多余的逗号就可以实现上述需求。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)