2010-05-08 51 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