Какой метод для чтения файла yaml и имеет тот же результат, что и для метода чтения ini? - PullRequest
0 голосов
/ 13 февраля 2019

Я работаю над проектом. Я хочу изменить файл конфигурации .ini на .yaml.В функции, которую я должен вернуть, прежде чем читать файл .ini, и теперь я хочу, чтобы он имел тот же тип возврата, но в файл .yaml.Как мне это сделать?Может ли кто-нибудь объяснить мне, что это за возврат?

  • В файл .yaml

    stream = file('file.yaml', 'r')    
    return yaml.load(stream) ????
    return yaml.dump(stream) ???? ????
    
  • В файл .ini

    config = ConfigParser.ConfigParser()    
    config.read('file.ini')
    return config
    

Если я напечатаю config, у меня будет это:

ConfigParser.ConfigParser instance at 0x000000000124FE08

1 Ответ

0 голосов
/ 14 февраля 2019

Поскольку вы делаете config = ConfigParser.ConfigParser(), то наверняка config является экземпляром ConfigParser.Он имеет все виды специальных методов, и предполагается, что остальная часть вашей программы сможет вызывать его.

Если вы не хотите изменять остальную часть вашей программы, вам следует настроить файл конфигурации YAML с помощьюв корне - отображение, ключами которого являются имена разделов в вашем INI-файле, а значения снова отображаются, представляющие пары ключ-значение каждого раздела:

section1:
  key1: value1
  key2: value2

section2:
  key1: value3
  key3: value4

Затем вы загружаете этот файл YAML ипреобразовать полученную структуру данных в экземпляр ConfigParser, который затем можно использовать в качестве чтения ConfigParser из файла INI:

import sys
import ruamel.yaml
from configparser import ConfigParser


yaml = ruamel.yaml.YAML(typ='safe')
with open('file.yaml', 'r') as stream:
    data = yaml.load(stream)

config = ConfigParser()
config.read_dict(data)
config.write(sys.stdout)

, что дает:

[section1]
key1 = value1
key2 = value2

[section2]
key1 = value3
key3 = value4

То есть config (при условииВаш file.yaml имеет смысл), может быть передан остальной части программы.

Обратите внимание:

  • config.write() только там, чтобы показать, что результат ConfigParser Например, в финальной программе вам это не нужно.
  • Ваш пример загрузки YAML не закрывает входной поток, что не является хорошей практикой.Используйте оператор with или передайте pathlib.Path в yaml.load:

    from pathlib import Path
    file_name = Path('file.yaml')
    yaml.load(file_name)
    
  • Можно напрямую загрузить экземпляр ConfigParser, пометив отображение корневого уровня вваш файл YAML и обеспечивает соответствующую обработку тегов, но я не думаю, что это того стоит.Лучше было бы потратить ваше время, изменив остальную часть программы с принятия разделов на непосредственное обращение к data (двухуровневая структура словаря).

...