Analizar un archivo .txt
-
03-07-2019 - |
Pregunta
Tengo un archivo .txt como:
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
¿Cómo puedo analizar este archivo y obtener las funciones con el tipo FUNC? Además, desde este txt, ¿cómo puedo analizar y extraer el nombre .o?
¿Cómo puedo obtenerlos mediante el análisis inteligente de la columna o cómo?
Necesito una ayuda inmediata ... Esperando una solución adecuada como de costumbre
Solución
Creo que esto podría costar menos que el uso de expresiones regulares, aunque no estoy del todo claro sobre lo que estás tratando de lograr
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]))
Aprendí de otras publicaciones que es más barato y mejor resumir todos los datos cuando estás leyendo un archivo por primera vez. Por lo tanto, si desea resumir todo el archivo de datos en una sola pasada, puede hacer lo siguiente
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={}
Luego, si quieres el tipo de función, utilizarías lo siguiente:
funcDict={}
for record in fullDict:
if fullDict[record]['Type']=='FUNC':
funcDict[record]=fullDict[record]
Lo siento por ser tan obsesivo, pero estoy tratando de tener una mejor idea de cómo crear una lista de comprensión y decidí que esto era digno de una inyección
Otros consejos
for line in open('thefile.txt'):
fields = line.split('|')
if len(fields) < 4: continue
if fields[3].trim() != 'FUNC': continue
dowhateveryouwishwith(line, fields)
Aquí hay un enfoque básico. ¿Qué piensas?
# 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])