我有一个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函数列表作为值。
我到达这里。
但是没有想法如何继续实现我的目标。
我认为我的问题很明确。
请帮帮我。
答案 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))