从文件名构建嵌套字典的实用指南

花韻仙語
发布: 2025-10-28 11:59:24
原创
316人浏览过

从文件名构建嵌套字典的实用指南

本文档旨在指导读者如何从包含结构化信息的文件名列表中,高效地构建嵌套字典。通过解析文件名中的关键信息,动态地创建或填充嵌套字典的层级结构,从而实现数据的有效组织和管理。本文将提供详细的代码示例,并讨论在实际应用中需要注意的关键点,帮助读者掌握这一实用技巧。

在处理大量文件时,文件名通常包含了重要的结构化信息。例如,文件名可能指示文件所属的类别、子类别,甚至更深层次的属性。利用这些信息,我们可以构建嵌套字典,将文件按照其内在的逻辑关系组织起来,方便后续的数据访问和处理。

从文件名解析字典结构

假设我们有一个文件夹,其中包含的文件名遵循一定的命名规则,例如 vz_ERA_Neural_Water_Forecast.npy。该文件名表示一个嵌套结构,其中 vz 是根字典的名称,ERA 是第一层键,Neural 是第二层键,Water_Forecast 是第三层键。

我们的目标是根据这些文件名,自动构建一个嵌套字典,并将文件内容加载到相应的字典项中。

知我AI
知我AI

一款多端AI知识助理,通过一键生成播客/视频/文档/网页文章摘要、思维导图,提高个人知识获取效率;自动存储知识,通过与知识库聊天,提高知识利用效率。

知我AI 101
查看详情 知我AI
import os
from pathlib import Path
import numpy as np
import xarray as xr  # 假设需要处理 xarray 数据

def build_nested_dictionary(folder_path, fileNamesAndTypes_check):
    """
    从指定文件夹中的文件名构建嵌套字典。

    Args:
        folder_path (str): 包含文件的文件夹路径。
        fileNamesAndTypes_check (dict): 文件名(不带扩展名)到文件类型的映射。

    Returns:
        dict: 构建的嵌套字典。
    """

    vz_reloaded = {}  # 初始化主字典

    files = [f for f in os.listdir(folder_path) if not f.startswith('.') and f != 'fileNamesAndTypes.txt']  # 过滤文件

    for file in files:
        file_path = Path(folder_path, file)
        fileNoExt = Path(file).stem  # 去除扩展名
        keys = fileNoExt.split('_')
        if 'vz' in keys:
            keys.remove('vz')  # 移除根名称

        reloadedType = fileNamesAndTypes_check[fileNoExt] # 获取文件类型

        try:
            if reloadedType == str:
                with open(file_path, 'rb') as f:
                    contents = f.read()
            elif reloadedType == xr.core.dataset.Dataset:
                contents = xr.open_dataset(file_path)
            elif reloadedType == xr.core.dataarray.DataArray:
                contents = xr.open_dataarray(file_path)
            elif reloadedType == int:
                contents = np.load(file_path).item() # 或者其他加载方式
            elif reloadedType == list:
                contents = np.load(file_path).tolist()
            elif reloadedType == np.ndarray:
                contents = np.load(file_path)
            else:
                contents = None
                print(f"Unsupported file type: {reloadedType} for file {file}")


            # 动态构建嵌套字典
            current_dict = vz_reloaded
            for i, key in enumerate(keys):
                if i == len(keys) - 1:
                    current_dict[key] = contents  # 最后一个键,赋值
                else:
                    if key not in current_dict:
                        current_dict[key] = {}  # 如果键不存在,创建新的字典
                    current_dict = current_dict[key]  # 进入下一层

        except Exception as e:
            print(f"Error processing file {file}: {e}")

    return vz_reloaded


# 示例用法
# 假设 fc.selected 是包含 'vz_save' 文件夹的路径
fc_selected = "./data"  # 替换为你的实际路径
folder_path = Path(fc_selected, 'vz_save')

# 假设 fileNamesAndTypes_check 已经定义
fileNamesAndTypes_check = {
    "ERA_Neural_Water_Forecast": str,
    "ERA_Polynomial_Reof": np.ndarray,
    # ... 其他文件名和类型
}

# 创建一个模拟的 vz_save 文件夹和一些文件
if not os.path.exists(folder_path):
    os.makedirs(folder_path)

# 创建一些模拟文件
with open(Path(folder_path, "ERA_Neural_Water_Forecast.txt"), "w") as f:
    f.write("This is a test string.")
np.save(Path(folder_path, "ERA_Polynomial_Reof.npy"), np.array([1, 2, 3]))

vz_reloaded = build_nested_dictionary(folder_path, fileNamesAndTypes_check)
print(vz_reloaded)
登录后复制

代码解释:

  1. build_nested_dictionary(folder_path, fileNamesAndTypes_check) 函数:
    • 接受文件夹路径和文件名到类型的映射作为输入。
    • 使用 os.listdir() 获取文件夹中的所有文件,并过滤掉隐藏文件和 fileNamesAndTypes.txt。
    • 遍历每个文件,提取文件名(不带扩展名),并根据 _ 分割文件名以获取键的列表。
    • 使用 fileNamesAndTypes_check 字典确定文件类型,并使用相应的函数加载文件内容。
    • 使用循环动态构建嵌套字典。current_dict 变量跟踪当前字典的层级,如果键不存在,则创建新的字典。
    • 最后,将文件内容赋值给最内层的键。
  2. 文件类型处理:
    • 代码示例中包含了对 str, xr.core.dataset.Dataset, xr.core.dataarray.DataArray, int, list, 和 np.ndarray 类型的处理。可以根据实际需要扩展此部分。
  3. 错误处理:
    • 代码包含 try...except 块,用于捕获文件处理过程中可能出现的异常,例如文件不存在或文件类型不匹配。

注意事项:

  • 文件类型映射: fileNamesAndTypes_check 字典至关重要,它定义了文件名和文件类型的对应关系。确保此映射的准确性。
  • 文件加载: 根据实际文件类型选择合适的加载方式。例如,.npy 文件可以使用 numpy.load() 加载,.txt 文件可以使用 open() 读取。
  • 错误处理: 在实际应用中,需要完善错误处理机制,例如记录错误日志或提供更详细的错误信息。
  • 性能优化: 对于包含大量文件的文件夹,可以考虑使用多线程或多进程来加速文件加载和字典构建过程。

总结

本文档介绍了如何从文件名构建嵌套字典。通过解析文件名,动态地创建或填充嵌套字典的层级结构,可以有效地组织和管理大量文件。希望本文档能够帮助读者掌握这一实用技巧,并在实际应用中灵活运用。

以上就是从文件名构建嵌套字典的实用指南的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号