跳转至

将子目录中的所有文件拷贝到子目录中并添加-

先遍历子目录中所有符合要求的文件

Python
def get_files_in_directory(directory, fileension):
    # 创建一个字典来存储目录和文件名
    directory_map = {}

    # 遍历目录及其子目录
    for root, dirs, files in os.walk(directory):
        # 将当前目录下的所有文件名添加到字典中
        for file in files:
            if file.endswith(fileension):
                # 获取当前目录名
                fileName = os.path.join(root, file)
                current_dir = root.replace(path, "")
                # current_dir = re.sub(r'\\', '-',os.path.dirname(fileName))
                current_dir = re.sub(r"\\", "-", current_dir)
                # 如果当前目录名不在字典中,则添加它
                if current_dir not in directory_map:
                    directory_map[current_dir] = []
                directory_map[current_dir].append(file)

    return directory_map

将目录和文件名获取后进行拆解

Python
def get_special_file(directory_map, isCopy=False):
    """
    处理特殊文件。

    根据提供的目录映射字典,对每个文件进行处理。如果指定复制,则将文件从原始位置复制到新位置。

    参数:
        directory_map (dict): 一个字典,键为目录名,值为该目录下的文件列表。
        isCopy (bool): 是否复制文件,默认为False。

    返回:
        list: 包含处理过的文件名的列表。
    """
    # 创建一个列表来存储处理过的文件名
    fileNameList = []
    # 遍历目录映射字典中的每个目录和文件
    for directory, files in directory_map.items():
        for file in files:
            # 排除空目录
            if directory != "":
                # 如果目录名末尾没有"-",则添加之
                if directory[-1] != "-":
                    directory += "-"
                # 组合得到文件的完整名
                svgName = directory + file
                # 准备文件的源路径和目标路径
                preSvgName = path + directory.replace("-", "\\") + file
                # 将文件名(不包含扩展名)添加到列表中
                fileNameList.append(svgName.split(".")[0])
                # 准备文件的新路径
                newSvgName = path + svgName
                # 如果指定复制文件,则执行复制操作
                if isCopy:
                    os.system(f"copy {preSvgName} {newSvgName}")

    # 返回处理过的文件名列表
    return fileNameList

将信息写入json

Python
1
2
3
4
5
6
7
 # 将filenameList写入list.json文件,key值为filename
    final_dict = {"data": [{"name": fileName} for fileName in fileNameList]}
    # 转换为 JSON
    json_string = json.dumps(final_dict, ensure_ascii=False)
    with open(f"{path}\\list.json", "w", encoding="utf-8") as file:
        file.write(json_string)
    print(f"{path}\\list.json")

完整的代码如下所示

Python
# 获取目录下所有的dwg文件名和文件路径
import os
import re
import sys
import json


def get_files_in_directory(directory, fileension):
    # 创建一个字典来存储目录和文件名
    directory_map = {}

    # 遍历目录及其子目录
    for root, dirs, files in os.walk(directory):
        # 将当前目录下的所有文件名添加到字典中
        for file in files:
            if file.endswith(fileension):
                # 获取当前目录名
                fileName = os.path.join(root, file)
                current_dir = root.replace(path, "")
                # current_dir = re.sub(r'\\', '-',os.path.dirname(fileName))
                current_dir = re.sub(r"\\", "-", current_dir)
                # 如果当前目录名不在字典中,则添加它
                if current_dir not in directory_map:
                    directory_map[current_dir] = []
                directory_map[current_dir].append(file)

    return directory_map


# 获取当前脚本目录
def get_current_file_path():
    # 通过命令行参数获取当前脚本的绝对路径
    abs_file = sys.argv[0]
    # 将路径中的斜杠替换为反斜杠,以适应Windows系统
    windows_path = abs_file.replace("/", "\\")
    # 去除路径中的脚本文件名,仅保留目录部分
    windows_path = windows_path[: windows_path.rfind("\\")]
    # 返回脚本所在的目录路径
    return windows_path


def get_special_file(directory_map, isCopy=False):
    """
    处理特殊文件。

    根据提供的目录映射字典,对每个文件进行处理。如果指定复制,则将文件从原始位置复制到新位置。

    参数:
        directory_map (dict): 一个字典,键为目录名,值为该目录下的文件列表。
        isCopy (bool): 是否复制文件,默认为False。

    返回:
        list: 包含处理过的文件名的列表。
    """
    # 创建一个列表来存储处理过的文件名
    fileNameList = []
    # 遍历目录映射字典中的每个目录和文件
    for directory, files in directory_map.items():
        for file in files:
            # 排除空目录
            if directory != "":
                # 如果目录名末尾没有"-",则添加之
                if directory[-1] != "-":
                    directory += "-"
                # 组合得到文件的完整名
                svgName = directory + file
                # 准备文件的源路径和目标路径
                preSvgName = path + directory.replace("-", "\\") + file
                # 将文件名(不包含扩展名)添加到列表中
                fileNameList.append(svgName.split(".")[0])
                # 准备文件的新路径
                newSvgName = path + svgName
                # 如果指定复制文件,则执行复制操作
                if isCopy:
                    os.system(f"copy {preSvgName} {newSvgName}")

    # 返回处理过的文件名列表
    return fileNameList


if __name__ == "__main__":
    print(
        """
        fileension: \033[34mdwg,dxf, svg,pdf,bmp,png\033[0m等等
        isCopy: 是否复制文件到当前目录
        获取目录下所有的dwg文件名和文件路径
        """
    )
    # path = get_current_file_path()
    # if path is None:
    path = "E:\\Gitee\\vue\\gallery\\Gallery\\src\\assets\\icons\\"
    # 如果path最后不带\\结尾,则添加\\
    if path[-1] != "\\":
        path += "\\"
    print(path)
    isCopy = input("是否复制文件到当前目录?(y/n)")
    if isCopy == "y":
        isCopy = True
    else:
        isCopy = False
    fileension = input("请输入文件后缀名:")
    if fileension == "":
        fileension = ".svg"

    if fileension[0] != ".":
        fileension = "." + fileension

    directory_map = get_files_in_directory(path, fileension)
    fileNameList = get_special_file(directory_map, isCopy)

    # 将filenameList写入list.json文件,key值为filename
    final_dict = {"data": [{"name": fileName} for fileName in fileNameList]}
    # 转换为 JSON
    json_string = json.dumps(final_dict, ensure_ascii=False)
    with open(f"{path}\\list.json", "w", encoding="utf-8") as file:
        file.write(json_string)
    print(f"{path}\\list.json")