You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Hydra配置中获取目录下所有文件名并读取文件?

问题原因及解决方法

问题根源

YAML解析器不会自动处理通配符*,所以你在config.yaml中定义file_name: ${paths.data_dir}/train/*后,self.hparams.file_name拿到的是带*的字符串,而非你期望的文件路径列表。循环时会把这个字符串拆成单个字符遍历,导致np.loadtxt接收无效路径报错。

解决方法

方法1:代码中用glob展开通配符

直接在代码里用glob模块解析通配符,兼容单个文件和多文件场景:

import glob
import numpy as np

# 展开通配符得到所有匹配的文件路径
file_paths = glob.glob(self.hparams.file_name)
dat = []
for file in file_paths:
    dat.append(np.loadtxt(file))

方法2:YAML中直接列出所有文件

如果文件数量固定,直接把file_name定义为列表:

file_name:
  - ${paths.data_dir}/train/train1.txt
  - ${paths.data_dir}/train/train2.txt
  - ${paths.data_dir}/train/train3.txt

此时self.hparams.file_name就是List[str],你的原循环代码可以直接正常运行。

方法3:YAML自定义标签(进阶)

如果需要在YAML层面处理通配符,可以自定义标签解析逻辑。比如在YAML中写:

file_name: !glob ${paths.data_dir}/train/*

然后加载YAML时注册标签处理函数:

import yaml
import glob

def glob_constructor(loader, node):
    path = loader.construct_scalar(node)
    return glob.glob(path)

yaml.add_constructor('!glob', glob_constructor)

# 加载配置
with open('config.yaml', 'r') as f:
    config = yaml.load(f, Loader=yaml.FullLoader)

这种方式适合需要频繁在配置中使用通配符的场景。

注意事项

  • 确保${paths.data_dir}已被正确解析为实际目录路径,否则通配符无法匹配到文件。
  • 使用glob时注意路径类型(相对/绝对),避免因路径错误找不到文件。

内容的提问来源于stack exchange,提问作者abhijit dhakane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:15:34