2015-03-05 5 views
0

Мне нужно разобрать сложный файл конфигурации с помощью Python. Я должен отметить, что формат этих файлов - это то, что я не могу изменить, а скорее должен жить.Лучший способ разобрать сложный файл конфигурации

Основная структура файла заключается в следующем:

Keyword1 
"value1" 
thisisirrelevantforkeyword1 
Keyword2 
"first", "second", "third" 
1, 2, 3 

Keyword3 
2, "whatever" 
firstparam, 1 
secondparam, 2 
again_not_relevant 

В конечном счете, выход из этого должен быть строкой в ​​формате JSON.

Поясню:

  • Каждое ключевое слово имеет свои собственные правила.
  • Значения указаны в строке (-ях), следующей за ключевым словом.
  • Например, Ключевое слово1 имеет одно значение, которое представляет собой строку value1. Строка, следующая за value1, не имеет значения.
  • Например, Ключевое слово2 имеет два параметра, первый из которых представляет собой список строк, второй - список целых чисел.
  • Например, Ключевое слово3 имеет переменное количество параметров, обозначаемое первым целым числом в первой строке после Ключевое слово3. Таким образом, параметры, релевантные для Ключевое слово3 - это список 2, «независимо» и два списка в двух следующих строках.

Существует фиксированный набор ключевых слов со своими правилами. Конечно, я мог бы в принципе жестко закодировать все это, что привело бы к многому дублированию кода. Кроме того, это было бы довольно негибким по отношению к новым ключевым словам или изменению правил для отдельных ключевых слов.

Я предпочел бы подготовить файл CSV, содержащий все ключевые слова, с правилом, как он определен, а затем использовать его как вход для более общей функции парсера.

Так что мой вопрос: - Как я могу указать правила простым способом? Я уверен, что для этого есть стандарты, но совершенно не знаю, с чего начать. - Как я мог использовать эту грамматику для разбора файла и создания моего JSON?

Я знаю, что это довольно конкретная, особая и сложная вещь; поэтому я уже был благодарен за указатели в правильном направлении, поскольку я чувствую себя немного потерянным и не уверен, с чего начать смотреть.

+1

Вы должны, по крайней мере, принять удар на это. Используйте модель конечного автомата. Для каждой строки, если это ключевое слово, используйте процедуры разбора этого раздела. Если это не ключевое слово, перейдите к подпрограмме синтаксического анализа текущего раздела ключевого слова. Сообщите нам, что вы придумали. – mpez0

ответ

1

Я думаю, что у вас могут быть классы для ваших вариантов, которые имеют действительно специальные правила.

Нечто подобное:

class OptionBase(object): 
    def __init__(self, name, **options): 
     self.name = name 
     self.raw_config_lines = [] 

    def parse_line(self, line): 
     line = line.strip() 
     if line: 
      self.raw_config_lines.append(line) 

    def get_config(self): 
     raise Exception('Not Implemented') 


class SimpleOption(OptionBase): 
    def __init__(self, name, **options): 
     super(SimpleOption, self).__init__(name, **options) 
     self.expected_format = options.get('expected_format', str) 

    def parse_line(self, line): 
     if len(self.raw_config_lines): 
      raise Exception('SimpleOption can only have one value') 
     else: 
      super(SimpleOption, self).parse_line(line) 

    def get_config(self): 
     return None if not self.raw_config_lines else self.expected_format(self.raw_config_lines[0]) 


class SomeComplexOption(OptionBase): 
    def parse_line(self, line): 
     #some special code which verify number of lines, type of args etc. 

    def get_config(self): 
     #some code to transform raw_line in another format