如何在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
相关产品推荐
相关产品推荐

