Разобрать файл .txt - PullRequest
       10

Разобрать файл .txt

1 голос
/ 04 мая 2009

У меня есть файл .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

Как мне разобрать этот файл и получить функции с типом FUNC? Кроме того, из этого текста, как я могу разобрать и извлечь имя .o?

Как я могу получить их с помощью анализа столбцов или как?

Мне нужна немедленная помощь ... Как обычно, жду подходящего решения

Ответы [ 3 ]

9 голосов
/ 04 мая 2009
for line in open('thefile.txt'):
  fields = line.split('|')
  if len(fields) < 4: continue
  if fields[3].trim() != 'FUNC': continue
  dowhateveryouwishwith(line, fields)
4 голосов
/ 05 мая 2009

Я думаю, что это может стоить меньше, чем использование регулярных выражений, хотя я не совсем понимаю, чего вы пытаетесь достичь

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]))

Я узнал из других постов, что дешевле и лучше обернуть все данные, когда вы читаете файл в первый раз. Таким образом, если вы хотите обернуть весь файл данных за один проход, вместо этого вы можете сделать следующее

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={}

Тогда, если вам нужен тип Func, вы должны использовать следующее:

funcDict={}
for record in fullDict:
    if fullDict[record]['Type']=='FUNC':
        funcDict[record]=fullDict[record]

Извините за то, что я так одержим, но я пытаюсь лучше разобраться в создании списочных представлений, и я решил, что это стоит того, чтобы попробовать

2 голосов
/ 04 мая 2009

Вот базовый подход. Что ты думаешь?

# 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])
...