背景

通过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多余的逗号就可以实现上述需求。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐