用python解析文件

用python解析文件,python,Python,我的输入文件是这样的 key "value" key "value" ... the above lines repeat ObjInstance = CustomClass() fields = ['key1', 'key2', 'key3'] for field in fields: for line in f: if line.find(field) >= 0: if pgn_field == 'ke

我的输入文件是这样的

key "value"
key "value"
... the above lines repeat
ObjInstance = CustomClass()
fields = ['key1', 'key2', 'key3']

    for field in fields:
        for line in f:
            if line.find(field) >= 0:
                if pgn_field == 'key1':
                    objInstance.DataOne = get_value_using_re(line)
                elif pgn_field == 'key2':
                    objInstance.DataTwo = get_value_using_re(line)

return objInstance;
我要做的是读取文件内容,用数据填充对象并返回它。文件中只能存在一组密钥。由于我是python的初学者,我觉得我读取文件的代码不是很好

我的代码是这样的

key "value"
key "value"
... the above lines repeat
ObjInstance = CustomClass()
fields = ['key1', 'key2', 'key3']

    for field in fields:
        for line in f:
            if line.find(field) >= 0:
                if pgn_field == 'key1':
                    objInstance.DataOne = get_value_using_re(line)
                elif pgn_field == 'key2':
                    objInstance.DataTwo = get_value_using_re(line)

return objInstance;
函数“get_value_using_re”非常简单,它在双引号之间查找字符串并返回它

我担心我会有多个if-elif语句,我不知道这是否正确


我在这里做的是对的吗?

Python中的正常方法是:

for line in f:
    mo = re.match(r'^(\S+)\s+"(.*?)"\s*$',line)
    if not mo: continue
    key, value = mo.groups()
    setattr(objInstance, key, value)

如果
不是正确的属性名,那么在最后一行代替
您可以使用类似
translate.get(key,'other')
的内容来获得适当的dict
translate
我建议查看python的YAML解析器。它可以方便地读取与之非常相似的文件并将其输入python字典。使用YAML解析器:

import yaml
map = yaml.load(file(filename))
然后,您可以像访问普通字典一样使用map[key]返回值来访问它。yaml文件如下所示:

key1: 'value'
key2: 'value'

这确实要求所有键都是唯一的。

为什么这是正常的方法?在我看来,解析不是一组regexp.@dzen,对于足够简单的解析任务,REs是猫的睡衣:快速、紧凑、方便<代码>pyparsing和其他工具在需要更多功能时(例如匹配嵌套括号)是可以使用的,但在这里可能会有些过分,因此,这不是正常的方法;广泛的字符串操作(
find
调用、切片等)通常较慢且更详细。正确的做法是尽可能使用现有的文件格式,如INI(由ConfigParser读取)或JSON(由JSON读取)。我的文件不是配置文件,但用户将上载的文件。字符串键/值对列表可以使用INI、JSON、YAML格式表示,无论您是否称之为配置文件。不要重新发明轮子。我不是在重新发明轮子,我应该早点说清楚。我的key,value示例是一个简单的示例,该文件还将包含一个没有“key”的文本字符串。我问题的主要部分是if elif和我不知道setattr。感谢您让我了解ConfigParser。我认为YAML解析器对我不起作用,因为该文件可能包含一些没有密钥的文本。