Python — извлекать строки из файла журнала и записывать их в другой файл

#python #file

#python #файл

Вопрос:

У меня есть файл журнала, как показано ниже:

 sw2 switch_has sw2_p3.
sw1 transmits sw2_p2
/* BUG: axiom too complex: SubClassOf(ObjectOneOf([NamedIndividual(#t_air_sens2)]),DataHasValue(DataProperty(#qos_type),^^(latency,http://www.xcx.org/1900/02/22-rdf-syntax-ns#PlainLiteral))) */
/* BUG: axiom too complex: SubClassOf(ObjectOneOf([NamedIndividual(#t_air_sens2)]),DataHasValue(DataProperty(#topic_type),^^(periodic,http://www.xcx.org/1901/11/22-rdf-syntax-ns#PlainLiteral))) */
...
  

что меня интересует, так это извлечение определенных слов из /* BUG... строк и запись их в отдельный файл, что-то вроде приведенного ниже:

 t_air_sens2 qos_type latency
t_air_sens2 topic_type periodic
...
  

Я могу сделать это с помощью awk и regex в оболочке, как показано ниже:

 awk -F'#|\^\^\(' '{for (i=2; i<NF; i  ) printf "%s%s", gensub(/[^[:alnum:]_].*/,"",1,$i), (i<(NF-1) ? OFS : ORS) }' output.txt > ./LogErrors/Properties.txt
  

Как я могу извлечь их с помощью Python? (должен ли я снова использовать регулярное выражение или ..?)

Ответ №1:

Вы, конечно, можете использовать регулярные выражения. Я бы читал построчно, брал строки, с которых они начинаются '/* BUG:' , а затем анализировал их по мере необходимости.

 import re

target = r'/* BUG:'
bugs = []
with open('logfile.txt', 'r') as infile, open('output.txt', 'w') as outfile:
    # loop through logfile
    for line in infile:
        if line.startswith(target):
            # add line to bug list and strip newlines
            bugs.append(line.strip())
            # or just do regex parsing here
            # create match pattern groups with parentheses, escape literal parentheses with ''
            match = re.search(r'NamedIndividual(([w#] ))]),DataHasValue(DataProperty(([w#] )),^^(([w#] ),', line)
            # if matches are found
            if match:
                # loop through match groups, write to output
                for group in match.groups():
                    outfile.write('{} '.format(group))
                outfile.write('n')
  

В Python встроен довольно мощный модуль регулярных выражений: re module

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

Примечание: необработанные строки ( r'xxxx' ) позволяют использовать неэкранированные символы.

Ответ №2:

Я попробовал следующим образом и получил конкретные строки файла журнала.

 target =["BUGS"] # array with specific words

with open('demo.log', 'r') as infile, open('output.txt', 'w') as outfile:

    for line in infile:

        for phrase in target:

            if phrase in line:

                outfile.write('{} '.format(line)) 
  

При этом будут выводиться строки, включающие слова в целевой объект, а вывод записывается в output.txt досье.