2014-02-06 2 views
1

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

Вот моя первая попытка:

#!/usr/bin/env python 

from sys import argv 

script, filename = argv 
with open(filename) as f: 
    for line in f: 
     try: 
      e = line.index("some_term_I_want_to_match") 
     except: 
      pass 
     else: 
      print(line) 

Как я могу улучшить это:

  • сохранить результат в новый файл аналогичного имени (то есть, другое расширение)
  • использования regex, чтобы сделать его более гибким/мощным.

(я только учусь Python. Этот вопрос, как много об изучении Python как речь идет о выполнении этого конкретного результата.)

Хорошо, вот что я придумал до сих пор ... Но как сделать эквивалент предваряя в r как в следующей строке

re.compile(r"\s*") 

где строка является не строковым, а в следующей строке?

re.compile(a_string_variable) 

Кроме того, я думаю, что это обновленная версия делает работу:

#!/usr/bin/env python 

from sys import argv 
import re 
import os 
import argparse #requires Python 2.7 or above 

parser = argparse.ArgumentParser(description='filters a text file on the search phrase') 
parser.add_argument('-s','--search', help='search phrase or keyword to match',required=True) 
parser.add_argument('-f','--filename', help='input file name',required=True) 
parser.add_argument('-v','--verbose', help='display output to the screen too', required=False, action="store_true") 
args = parser.parse_args() 

keyword = args.search 
original_file = args.filename 
verbose = args.verbose 

base_file, ext = os.path.splitext(original_file) 
new_file = base_file + ".filtered" + ext 

regex_c = re.compile(keyword) 

with open(original_file) as fi: 
    with open(new_file, 'w') as fo: 
     for line in fi: 
      result = regex_c.search(line) 
      if(result): 
       fo.write(line) 
       if(verbose): 
        print(line) 

Может ли это быть легко улучшена?

+2

Почему бы не использовать 'grep'? Если вы хотите использовать regex и настаивать на написании этого в Python, посмотрите на модуль 're'. – Blender

+1

Не нужно «попробовать ... кроме» здесь, на мой взгляд. – squiguy

+0

Я обновил свой вопрос. И я хочу сделать это в Python, потому что я изучаю Python. – MountainX

ответ

1

Ну, вы знаете, вы ответили на большинство вопросов самостоятельно уже :)

Для регулярных выражений использования re module (док имеет довольно поясняющие примеры).

Вы уже использовали функцию open() для открытия файла. Используйте ту же функцию для открытых файлов для записи, просто укажите соответствующий параметр mode («w» или «a» в сочетании с «+», если вам нужно, см. help(open) в интерактивной оболочке Python). Вот и все.

+1

... и используйте модуль [os.path] (http://docs.python.org/3.3/library/os.path.html), чтобы изменить расширение файла. – Simon

+0

Я обновил свой вопрос – MountainX

+0

Ну, «улучшенный» - это не правильное слово, чтобы описать ваши потребности. Если он делает то, что вы хотите, его не следует улучшать. Если вам нужно что-то еще, вы должны сформулировать его явно. Я бы уменьшил уровень вложенности, объединив оба открытия файла в одном из операторов, но для этого потребовался бы объект, реализующий [Context Manager protocol] (http://docs.python.org/2/reference/datamodel.html#with-statement- контекст-менеджеры). Или просто используйте 'try: f = open (" original ") ... finally: f.close() ...', что означает почти то же самое, что и 'with' statement – user3159253

Смежные вопросы