2009-05-14 9 views
0

の.oファイル名の一覧を取得する:txtファイルの解析が私のようなtxtファイル持って

test.txtの

Symbols from __ctype_tab.o: 

Name     Value Class  Type   Size  Line Section 

__ctype    |00000000| D |   OBJECT|00000004|  |.data 
__ctype_tab   |00000000| r |   OBJECT|00000101|  |.rodata 


Symbols from _ashldi3.o: 

Name     Value Class  Type   Size  Line Section 

__ashldi3   |00000000| T |    FUNC|00000050|  |.text 


Symbols from _ashrdi3.o: 

Name     Value Class  Type   Size  Line Section 

__ashrdi3   |00000000| T |    FUNC|00000058|  |.text 


Symbols from _fixdfdi.o: 

Name     Value Class  Type   Size  Line Section 

__fixdfdi   |00000000| T |    FUNC|0000004c|  |.text 
__fixunsdfdi  |  | U |   NOTYPE|  |  |*UND* 


Symbols from _fixsfdi.o: 

Name     Value Class  Type   Size  Line Section 

__fixsfdi   |00000000| T |    FUNC|0000004c|  |.text 
__fixunssfdi  |  | U |   NOTYPE|  |  |*UND* 


Symbols from _fixunssfdi.o: 

Name     Value Class  Type   Size  Line Section 

__cmpdi2   |  | U |   NOTYPE|  |  |*UND* 
__fixunssfdi  |00000000| T |    FUNC|00000228|  |.text 
__floatdidf   |  | U |   NOTYPE|  |  |*UND* 

私は何をしたいことはあるが、私はその機能を与えられますタイプはNOTYPEです。私はtxtを検索して、それが定義されている(つまり、FUNCタイプで)見つける必要があります。私が.oファイルを取得すると、私はNOTYPEとして他の関数を見るかもしれません。それから私はそれらが定義されている場所を検索しなければなりません。最後に、関数を含むすべての.oファイルの名前のリストを返したいと思います。コードの

私の作品:ここ

notypeDict , funcDict = {} , {} 
notypeList , funcList = [] , [] 
currObj , prevObj = '' , '' 

fp = open(r'C:\test.txt','r') # file path cms here 
fileList = fp.readlines() 

for line in fileList: 
    if '.o' in line: # line containg .o 
     currObj=line.split()[-1][0:-1]   
    if '|' not in line: # line containg | 
     pass 
    else: # other lines 
     dataList=[dataItem.strip() for dataItem in line.strip().split('|')] # a list of each word in line 
     name=dataList[0].strip() # name of the function 
     notypeDict[prevObj] = notypeList # notypeDict is a dictionary which contains .o as key and a list of NOTYPE function name 
     funcDict[prevObj] = funcList # funcDict is a dictionary which contains .o as key and a list of FUNC function names 

     if prevObj == currObj : 
      pass 
     if prevObj != currObj :  
      notypeList , funcList = [] , [] 

     if dataList[3] == 'NOTYPE' :     
      notypeList.append(name) 
     if dataList[3] == 'FUNC' : 
      funcList.append(name) 

     prevObj = currObj  

print 'notypeDict' , notypeDict 
print '\n\nfuncDict' , funcDict 

私は2つの辞書、notypeDictとfuncDictを取得します。

notypeDictにはキーがあり、NOTYPE関数のリストは値 となります。funcDictにはキーがあり、値としてFUNC関数のリストがあります。

ここまで達しました。

しかし、私の目標を達成するための進め方を知りません。

私の質問ははっきりしていると思います。

私を助けてください。

答えて

1

ファイル内の興味深い行のさまざまな種類のキャプチャグループで正規表現を使用します。私は行単位でファイルを調べ、面白い行(つまり正規表現にマッチした行)を見つけたら、キャプチャしたデータを正規表現から適切に処理します。

辞書などを作成した後、データに基づいて質問に答えるのは簡単です。

1

あなたは次のことをどう思いますか?

if '.o' in line: # line containg .o 
     currObj=line.split()[-1][0:-1]   
    if '|' not in line: # line containg | 
     pass 
    else: # other lines 

「.o」または「|」を含む行はありますか?または他の?

いいえ、実際にはありません。

「.o」を含む行が見つかります。そして、彼らと何かをする。

次に、その行をもう一度 '|' 「その他」のいずれかです。すべての '.o'行が2回処理されます。

一度 '.o'として、再び 'not |'として。

ifではなくelifを意味する場合があります。


このコード

if prevObj == currObj : 
     pass 
    if prevObj != currObj :  
     notypeList , funcList = [] , [] 

は、それがあることが必要ではなく、より複雑です。問題はありません。それ自体はですが、それは愚かです。


このコード

はおそらく良いです。しかし、条件が排他的であり、より良く見えるので、それは悪く見えるelif

+0

私はelif – user46646

1

このコードはどうなりますか?あなたの2つの辞書に基づいています。 find_dep_for_func(notype_funcname)に電話するだけです。

def find_ofile(funcname): 
    """This will find .o file for given function.""" 
    for ofile, fns in funcDict.iteritems(): 
     if funcname in fns: 
      return ofile     
    raise Exception("Cannot find function "+funcname) 

def find_dependencies(ofile, deps = None): 
    """This will find dependent .o files for given .o file.""" 
    olist = deps if deps else set([]) 
    for fn in notypeDict[ofile]: 
     ofile = find_ofile(fn) 
     if not ofile in olist: 
      olist.add(ofile) 
      olist = find_dependencies(ofile, olist) 
    return olist 

def find_dep_for_func(notype_funcname): 
    return find_dependencies(find_ofile(funcname)) 
関連する問題