Файлы разбора Python - PullRequest
       7

Файлы разбора Python

0 голосов
/ 02 июля 2010

Мне нужно знать лучший подход для следующего сценария

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

 - : error:
 - : error [A-Z]*[\d ]*
 - [A-Z]*[\d]* [E\e|rror:
 -  " Cannot open include file " 
 -  " Could not find " 
 - "is not a member of"
 - "has not been declared"

Дайте мне знать, если это будет эффективно:

  • сбросить файл в какую-либо переменную и закрыть файл
  • grep для каждой ошибки из списка
  • или создайте регулярное выражение для каждой ошибки и проанализируйте переменную

Спасибо

Ответы [ 3 ]

2 голосов
/ 03 июля 2010

Если файл журнала велик, возможно, не стоит загружать его в память. Вместо этого вы можете предварительно скомпилировать все регулярные выражения и проверить их по строкам, например ::1001

def has_error(filename):
    with file(filename, 'r') as logfile:
        for line in logfile:
            for regexp in MY_REGEXPS:
                if regexp.search(line):
                    return True
        return False
0 голосов
/ 03 июля 2010

Это действительно не будет эффективно, так как вы читаете огромное количество данных в память, а затем пытаетесь работать с ним.Если у вас нет большого объема памяти, это, вероятно, не очень хорошая идея.

Вместо этого используйте генератор:

def parser(filename):
    with open(filename, 'r') as f: # For use in python > 2.4 I *think*.
        for line in f:
            if anymatches(line): # or whatever you want to do to generate a
                yield line       # true/false value

Это даст преимущество, заключающееся в том, что не загружает весь файл в памятьа также производить только те совпадения, которые вы запрашиваете - поэтому, если вам нужны только первые N совпадения, вы можете сделать это:

for i, match in zip(xrange(N), parser('mylogfile')):
    #do something with match
0 голосов
/ 03 июля 2010

Учитывая, что файл журнала большой, (более) эффективный способ проверки на ошибки - это перебирать файл по одной строке за раз и проверять каждую строку на соответствие вашим шаблонам.Вы не хотели бы держать в памяти огромный файл без необходимости.

В Python, вероятно, что-то вроде этого:

err = re.compile(': error(?::| [A-Z]*[\d ]*)|[A-Z]*\d* [Ee]rror:|' +
                 '" (?:Cannot open include file|Could not find) "|' +
                 '"(?:is not a member of|has not been declared)"')
with open('file.log') as f:
    for line in f:
        m = err.search(line)
        if m is not None:
            # this line indicates an error

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

err_list = ['error', 'Cannot open include file', 'Could not find', 'is not a member of', 'has not been declared']

и просто поиск каждой строки в каждой строке:

with open('file.log') as f:
    for line in f:
        if any(line.find(e) for e in err_list):
            # this line indicates an error
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...