0

0

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

花韻仙語

花韻仙語

发布时间:2025-10-28 11:59:24

|

328人浏览过

|

来源于php中文网

原创

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

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

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

从文件名解析字典结构

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

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

PhotoG
PhotoG

PhotoG是全球首个内容营销端对端智能体

下载
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() 读取。
  • 错误处理: 在实际应用中,需要完善错误处理机制,例如记录错误日志或提供更详细的错误信息。
  • 性能优化: 对于包含大量文件的文件夹,可以考虑使用多线程或多进程来加速文件加载和字典构建过程。

总结

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

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

318

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

538

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

52

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

481

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

143

2025.12.24

PHP 高并发与性能优化
PHP 高并发与性能优化

本专题聚焦 PHP 在高并发场景下的性能优化与系统调优,内容涵盖 Nginx 与 PHP-FPM 优化、Opcode 缓存、Redis/Memcached 应用、异步任务队列、数据库优化、代码性能分析与瓶颈排查。通过实战案例(如高并发接口优化、缓存系统设计、秒杀活动实现),帮助学习者掌握 构建高性能PHP后端系统的核心能力。

98

2025.10.16

PHP 数据库操作与性能优化
PHP 数据库操作与性能优化

本专题聚焦于PHP在数据库开发中的核心应用,详细讲解PDO与MySQLi的使用方法、预处理语句、事务控制与安全防注入策略。同时深入分析SQL查询优化、索引设计、慢查询排查等性能提升手段。通过实战案例帮助开发者构建高效、安全、可扩展的PHP数据库应用系统。

79

2025.11.13

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.3万人学习

Django 教程
Django 教程

共28课时 | 3.2万人学习

Excel 教程
Excel 教程

共162课时 | 12.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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