2015-10-12 25 views
0

我有一個類似如下的多行一些日誌文件:如何從文本文件實例化一組對象?

<tickPrice tickerId=0, field=2, price=201.81, canAutoExecute=1> 
<tickSize tickerId=0, field=3, size=25> 
<tickSize tickerId=0, field=8, size=534349> 
<tickPrice tickerId=0, field=2, price=201.82, canAutoExecute=1> 

我需要定義一個類類型tickPrice或tickSize的。在做定義之前,我需要決定使用哪一個。

抓取這些值的Pythonic方法是什麼?換句話說,我需要一個有效的方法來反轉str()在一個類上。

這些類已經定義並且只包含提供的變量,例如tickPrice.tickerId。我試圖找到一種方法從文本中提取這些值並設置實例屬性以匹配。

編輯:回答

這是我結束了doing-

with open(commandLineOptions.simulationFilename, "r") as simulationFileHandle: 
    for simulationFileLine in simulationFileHandle: 
     (date, time, msgString) = simulationFileLine.split("\t") 
     if ("tickPrice" in msgString): 
      msgStringCleaned = msgString.translate(None, ''.join("<>,")) 
      msgList = msgStringCleaned.split(" ") 
      msg = message.tickPrice() 
      msg.tickerId = int(msgList[1][9:]) 
      msg.field = int(msgList[2][6:]) 
      msg.price = float(msgList[3][6:]) 
      msg.canAutoExecute = int(msgList[4][15:]) 
     elif ("tickSize" in msgString): 
      msgStringCleaned = msgString.translate(None, ''.join("<>,")) 
      msgList = msgStringCleaned.split(" ") 
      msg = message.tickSize() 
      msg.tickerId = int(msgList[1][9:]) 
      msg.field = int(msgList[2][6:]) 
      msg.size = int(msgList[3][5:]) 
     else: 
      print "Unsupported tick message type" 
+0

會是什麼這樣一類的樣子? –

+3

你問如何instantiante已經定義的類的實例嗎?或者如何定義這些值的動態類的需求?無論哪種方式,您是否可以展示您解決問題的嘗試,而不是帶有(模糊)規範的數據樣本? –

+0

我會定義這兩個類。然後將它們存儲在字典中,並將其名稱作爲密鑰。在它們的構造函數中爲每個包含在「kwargs」中的項目執行一個'setattr'。夠清楚了嗎? ;)也許不是最好的方式 – Pynchia

回答

2

我不知道你想怎麼在你的命名空間中動態創建的對象,但下面至少會動態地創建根據您的loglines對象:

把你的行:

line = '<tickPrice tickerId=0, field=2, price=201.81, canAutoExecute=1>' 

刪除不感興趣的美國字符,然後分割線成一個列表:

line = line.translate(None, ''.join('<>,')) 
line = line.split(' ') 

名稱爲方便潛在的類屬性:

line_attrs = line[1:] 

然後創建你的對象(姓名,基礎元,ATTRS的字典):

tickPriceObject = type(line[0], (object,), { key:value for key,value in [at.split('=') for at in line_attrs]})() 

證明它可以作爲我們預計:

print(tickPriceObject.field) 
# 2 
+0

@ line = line.split('')'等於'line = line.split()' –

+0

@KevinGuan是的 - 我用分隔符來引起我在做什麼。 –

+0

謝謝tristan! – thephoenix

1

接近與正則表達式的問題,但具有相同的結果特里斯坦的出色答卷(和竊取他的使用type構造的,我將永遠無法記住)

import re 

class_instance_re = re.compile(r""" 
     <(?P<classname>\w[a-zA-Z0-9]*)[ ] 
     (?P<arguments> 
      (?:\w[a-zA-Z0-9]*=[0-9.]+[, ]*)+ 
     )>""", re.X) 

objects = [] 

for line in whatever_file: 
    result = class_instance_re.match(line) 
    classname = line.group('classname') 
    arguments = line.group('arguments') 
    new_obj = type(classname, (object,), 
        dict([s.split('=') for s in arguments.split(', ')])) 
    objects.append(new_obj)