Txt文件解析以获取.o文件名列表

时间:2009-05-14 08:30:49

标签: python parsing

我有一个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并找到它所定义的.o(即;类型为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

这里我将获得两个词典,notypeDict和funcDict。

notypeDict将.o作为键,并将NOTYPE函数列表作为值 funcDict将.o作为键,将FUNC函数列表作为值。

我到达这里。

但是没有想法如何继续实现我的目标。

我认为我的问题很明确。

请帮帮我。

3 个答案:

答案 0 :(得分:1)

我会将带有捕获组的正则表达式用于文件中不同类型的有趣行;我会逐行浏览文件,当我发现一条有趣的行(即匹配正则表达式)时,我会正确处理正则表达式中捕获的数据。

在建立了字典等之后,根据数据回答问题很容易。

答案 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'行都会被处理两次。

一次作为'.o',然后再作为“not |”。

您可能需要elif而不是if


此代码

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

比它需要的更复杂。不会导致问题,本身,但它看起来很傻。


此代码

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

可能很好。但是,它看起来很糟糕,因为条件是独占的,并且看起来会更好elif

答案 2 :(得分:1)

这段代码怎么样?它基于您的两个词典。只需致电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))