我需要使用Python解析一个复杂的配置文件。我应该注意到,这些文件的格式是我不能改变的,而是必须接受的。
文件的基本结构是:
Keyword1
"value1"
thisisirrelevantforkeyword1
Keyword2
"first", "second", "third"
1, 2, 3
Keyword3
2, "whatever"
firstparam, 1
secondparam, 2
again_not_relevant
最终,它的输出应该是一个JSON字符串。
让我解释一下:
- 每个关键字都有自己的规则
- 这些值在关键字后面的行中
- 例如,关键字1有一个值,即字符串值11后面的行无关紧要
- 例如,Keyword2有两个参数,第一个是字符串列表,第二个是整数列表
- 例如,Keyword3具有可变数量的参数,由Keyword3后第一行的第一个整数表示。因此,与关键字3相关的参数是列表2、"whatever"以及下面两行中的两个列表
有一组固定的关键字,它们有自己的规则。当然,原则上我可以对整个事情进行硬编码,这会导致很多代码重复。此外,对于新的关键字或更改单个关键字的规则,这将是非常不灵活的。
我宁愿准备一个包含所有关键字的CSV文件,以及如何定义关键字的规则,然后将其用作更通用的解析器函数的输入。
所以我的问题是:-如何以简单的方式指定规则?我确信这是有标准的,但绝对不知道从哪里开始寻找。-然后我如何使用这种语法来解析文件并生成JSON?
我知道这是一件非常具体、特别和复杂的事情;所以我已经很感激有人给我指引了正确的方向,因为我感到有点迷失,不确定从哪里开始寻找。
我认为您可以为您的选项创建一些类,这些类具有非常特殊的规则。
类似的东西:
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