2010-05-08 150 views
2
解析文件

我的输入文件将是这样的与蟒蛇

key "value" 
key "value" 
... the above lines repeat 

我做的是阅读文件内容,填充数据对象并返回它。文件中只有一定数量的密钥可以存在。由于我在python初学者,我觉得我的代码读取该文件并不好

我的代码是这样

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语句,我不知道这是否正确。

我在这里做正确的事情吗?

+0

正确的做法是使用现有的文件格式,如INI(由ConfigParser读取)或JSON(由json读取)。 – jfs 2010-05-08 15:20:23

+0

我的文件不会是一个配置文件,而是一个用户将要上传的文件。 – iJK 2010-05-08 16:04:58

+0

无论您是否将其称为配置文件,都可以使用INI,JSON,YAML格式表示字符串键/值对的列表。不要重新发明轮子。 – jfs 2010-05-09 00:22:08

回答

4

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) 

如果key不正确代替key你可能会使用类似translate.get(key, 'other')一些适当的字典属性名称,在最后一行行translate

+0

美丽:)谢谢 – iJK 2010-05-08 04:51:16

+0

为什么这是正常的方法?在我看来,解析s不是一组正则表达式。 – dzen 2010-05-08 08:29:59

+0

@dzen,用于简单_解析任务RE是猫的睡衣:快速,紧凑,方便。当需要更多的权力时(比如匹配嵌套的括号),'pyparsing'和其他工具都可以,但是这样做会过度杀伤,因此不是正常的方法。广泛的字符串操作('find'调用,切片等)通常较慢且较为冗长。 – 2010-05-08 14:32:17

2

我建议看一下python的YAML解析器。它可以方便地读取一个非常相似的文件,并将其输入到Python字典中。随着YAML解析器:

import yaml 
map = yaml.load(file(filename)) 

然后你就可以像一个正常的字典,地图[关键]返回值进行访问。 yaml文件将如下所示:

key1: 'value' 
key2: 'value' 

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

+0

我不认为YAML解析器会为我工作,因为该文件可以包含一些没有密钥的文本。 – iJK 2010-05-08 16:08:08