Parse eine TXT-Datei
-
03-07-2019 - |
Frage
Ich habe eine TXT-Datei wie:
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
Wie kann ich diese Datei ParsR und die Funktionen mit Typ FUNK bekommen? Auch aus diesem txt, wie kann ich analysieren und .o Namen extrahieren?
Wie kann ich sie durch spaltenweise Parsing oder sonst wie.
Ich brauche sofort Hilfe ... Warten auf eine geeignete Lösung wie üblich
Lösung
ich denke, das weniger kosten könnte als die Verwendung von regulären Ausdrücken, obwohl ich auf nicht ganz klar bin, was Sie versuchen zu erreichen
symbolList=[]
for line in open('datafile.txt','r'):
if '.o' in line:
tempname=line.split()[-1][0:-2]
pass
if 'FUNC' not in line:
pass
else:
symbolList.append((tempname,line.split('|')[0]))
Ich habe von anderen Beiträgen gelernt, es billiger und besser ist, alle Daten, einpacken, wenn Sie durch eine Datei zum ersten Mal lesen. Wenn Sie also das gesamte Daten-Datei in einem Durchgang einpacken wollten, dann könnten Sie die folgende stattdessen tun
fullDict={}
for line in open('datafile.txt','r'):
if '.o' in line:
tempname=line.split()[-1][0:-2]
if '|' not in line:
pass
else:
tempDict={}
dataList=[dataItem.strip() for dataItem in line.strip().split('|')]
name=dataList[0].strip()
tempDict['Value']=dataList[1]
tempDict['Class']=dataList[2]
tempDict['Type']=dataList[3]
tempDict['Size']=dataList[4]
tempDict['Line']=dataList[5]
tempDict['Section']=dataList[6]
tempDict['o.name']=tempname
fullDict[name]=tempDict
tempDict={}
Dann, wenn Sie den Func-Typen mögen Sie folgende verwenden würden:
funcDict={}
for record in fullDict:
if fullDict[record]['Type']=='FUNC':
funcDict[record]=fullDict[record]
Leider so obsessiv für zu sein, aber ich versuche, auf die Schaffung von Listenkomprehensionen besser in den Griff zu bekommen, und ich beschlossen, dass dies verdient ein Schuss
Andere Tipps
for line in open('thefile.txt'):
fields = line.split('|')
if len(fields) < 4: continue
if fields[3].trim() != 'FUNC': continue
dowhateveryouwishwith(line, fields)
Hier ist ein grundlegender Ansatz. Was denken Sie?
# Suppose you have filename "thefile.txt"
import re
obj = ''
for line in file('thefile.txt'):
# Checking for the .o file
match = re.search('Symbols from (.*):', line)
if match:
obj = match.groups()[0]
# Checking for the symbols.
if re.search('|', line):
columns = [x.strip() for x in a.split('|')]
if columns[3] == 'FUNC':
print 'File %s has a FUNC named %s' % (obj, columns[0])