Загрузите файлы yaml с подстановочным знаком в python

Я хочу открыть все файлы *.yaml в папке и загрузить их с помощью PyYaml. Каждый файл содержит один документ yaml. Мой недавний фрагмент кода:

stream = open("conf.d/*.yaml", 'r')
config = yaml.load_all(stream)

Это не удается, так как yaml.open явно не может работать с подстановочными знаками:

stream = open("conf.d/*.yaml", 'r')
IOError: [Errno 2] No such file or directory: 'conf.d/*.yaml'

Как правильно архивировать эту цель?


person Dakkar    schedule 27.02.2015    source источник


Ответы (1)


В Python 2.5+ можно использовать модуль glob для расширения подстановочного знака в список имен файлов.

>>> import glob
>>> a = glob.glob("*.yaml")
>>> print a
['test1.yaml', 'test2.yaml', 'test3.yaml']

Затем вы можете передать его итератору, например map(), чтобы создать список генераторов конфигурации PyYAML.

>>> import yaml
>>> import glob
>>> configs = map(lambda x: yaml.load_all(open(x)), glob.glob("*.yaml"))
>>> print configs
[<generator object load_all at 0x1078bfe10>, <generator object load_all at 0x1078bfd20>, <generator object load_all at 0x1078bfb90>]
>>> for config in configs:
...     for item in config:
...         print item
... 
{'date': datetime.date(2015, 2, 27), 'customer': {'given': 'Gordon', 'family': 'Jeff'}, 'location': 'Target'}
{'date': datetime.date(2015, 2, 25), 'customer': {'given': 'Earnhardt', 'family': 'Dale'}, 'location': 'Walmart'}
{'date': datetime.date(2015, 2, 23), 'customer': {'given': 'Petty', 'family': 'Richard'}, 'location': 'Target'}
person Community    schedule 27.02.2015
comment
Это решает проблему с самим подстановочным знаком, но для открытия требуется строка или поток в качестве входных данных. - person Dakkar; 27.02.2015
comment
@Dakkar Обновлено для перебора имен файлов и создания конфигураций. Имейте в виду, что yaml.load_all принимает только один поток или строку. Если вам нужна единая комбинированная конфигурация, вы можете попробовать прочитать содержимое файлов *.yaml и объединить их в один строковый объект для передачи в load_all. Это имеет нежелательный эффект перезаписи повторяющихся ключей YAML. - person ; 27.02.2015