Нужна помощь с чтением .cfg файла - PullRequest
0 голосов
/ 17 мая 2018

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

Category1 {
    Subcategory1 {
        Data1 = 120        # range [0:255]
        Data2 = "R_TRUE"   # Values "R_TRUE" "R_FALSE"
    }
    Subcategory2 {
        Data3 = 0
    }
}

При использовании ConfigParser консоль сообщает мне, что в моем файле отсутствуют заголовки, которые я предполагалнаписаны как [header].

Я впервые читаю .cfg файлов, и любой пример, который я нашел в интернете, был написан так:

[Category1]
A = 0
B = 10
C = "R_TRUE"

Так что мне было интересно:

  1. Если этот файл .cfg, который у меня есть, действительно неверен или принят синтаксис.

  2. Если вы знаете, какой синтаксис использовал человек, который его создалтак что я могу проверить его документ.Может быть, он сделал это для чтения на другом языке, кроме Python?

  3. Ну, если возможно, вы можете дать мне пример парсера для этого!

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Если вы знакомы с EBNF , вы можете сэкономить много времени, используя пакет python EBNFparser . Документы

По сути, вы даете ему определение языка EBNF, и оно создает для вас парсер (по крайней мере, в теории) .

0 голосов
/ 18 мая 2018

Вы можете создать для этого парсер, используя несколько выражений регулярных выражений. Вот пример.

cfg = '''\
Category1 {
    Subcategory1 {
        Data1 = 120        # range [0:255]
        Data2 = "R_TRUE"   # Values "R_TRUE" "R_FALSE"
    }
    Subcategory2 {
        Data3 = 0
    }
}'''

import re
category_match = re.compile(r'(\w+)\s*{')
value_match = re.compile(r'(\w+)\s*=\s*([0-9]+|"[^"]*")')
close_match = re.compile(r'}')

for line in cfg.split('\n'):
    m = category_match.search(line)
    if m:
        print ('1: ', m.groups()[0])
    m = value_match.search(line)
    if m:
        print ('2: ', m.groups()[:])
    m = close_match.search(line)
    if m:
        print ('3: close found')

Вывод такой.

1:  Category1
1:  Subcategory1
2:  ('Data1', '120')
2:  ('Data2', '"R_TRUE"')
3: close found
1:  Subcategory2
2:  ('Data3', '0')
3: close found
3: close found

В каждой строке вывода число является регулярным выражением, которое соответствует строке ввода.

0 голосов
/ 17 мая 2018

Этот синтаксис, похоже, был настроен из HOCON (json). Мое лучшее решение сейчас - создать собственный синтаксический анализатор, чтобы адаптировать его к синтаксису, который я хочу иметь.

Я не знаю, как закрыть эту тему, но если у кого-то есть реальный ответ для любого, кто сталкивается с такой же проблемой, как и я, не стесняйтесь поделиться этим! :)

...