Использование python (acora) для поиска строк, содержащих ключевые слова
Я пишу программу, которая читает в каталоге текстовых файлов и находит определенную комбинацию строк, которые перекрываются (то есть совместно используются всеми файлами). Мой текущий подход заключается в том, чтобы взять один файл из этого каталога, проанализировать его, создать список каждой строковой комбинации, а затем выполнить поиск этой строковой комбинации в других файлах. Например, если бы у меня было десять файлов, я бы прочитал один файл, проанализировал его, сохранил ключевые слова, которые мне нужны, а затем поискал в других девяти файлах эту комбинацию. Я бы повторил это для каждого файла (убедившись, что отдельный файл не ищет сам себя). Для этого я пытаюсь использовать модуль acora в python.
Код, который я до сих пор:
def match_lines(f, *keywords):
"""Taken from [https://pypi.python.org/pypi/acora/], FAQs and Recipes #3."""
builder = AcoraBuilder('\r', '\n', *keywords)
ac = builder.build()
line_start = 0
matches = False
for kw, pos in ac.filefind(f): # Modified from original function; search a file, not a string.
if kw in '\r\n':
if matches:
yield f[line_start:pos]
matches = False
line_start = pos + 1
else:
matches = True
if matches:
yield f[line_start:]
def find_overlaps(f_in, fl_in, f_out):
"""f_in: input file to extract string combo from & use to search other files.
fl_in: list of other files to search against.
f_out: output file that'll have all lines and file names that contain the matching string combo from f_in.
"""
string_list = build_list(f_in) # Open the first file, read each line & build a list of tuples (string #1, string #2). The "build_list" function isn't shown in my pasted code.
found_lines = [] # Create a list to hold all the lines (and file names, from fl_in) that are found to have the matching (string #1, string #2).
for keywords in string_list: # For each tuple (string #1, string #2) in the list of tuples
for f in fl_in: # For each file in the input file list
for line in match_lines(f, *keywords):
found_lines.append(line)
Как вы, вероятно, можете сказать, я использовал функцию match_lines
с веб-страницы acora, "FAQ и рецепты" #3. Я также использовал его в режиме для разбора файлов (используя ac.filefind()
), также находится на веб-странице.
Код, кажется, работает, но он только дает мне имя файла с соответствующей комбинацией строк. Мой желаемый вывод - выписать всю строку из других файлов, которые содержат мою подходящую комбинацию строк (кортеж).
1 ответ
Я не вижу, что здесь будет производить имена файлов, как вы говорите, это делает.
Независимо от того, чтобы получить номера строк, вам просто нужно посчитать их, когда вы передаете их в match_lines():
line_start = 0
line_number = 0
matches = False
text = open(f, 'r').read()
for kw, pos in ac.filefind(f): # Modified from original function; search a file, not a string.
if kw in '\r\n':
if matches:
yield line_number, text[line_start:pos]
matches = False
line_start = pos + 1
line_number += 1
else:
matches = True
if matches:
line_number, yield text[line_start:]