Я пытаюсь извлечь 5 строк до и после определенной комбинации ключевых слов из нескольких заявок SEC 10-K, а затем экспортировать эти данные в Excel, чтобы затем обработать их вручную. К сожалению, мне приходится полагаться на файлы формата .txt, а не на файлы .html или .xblr, потому что последние не всегда доступны. Я уже скачал и частично почистил файлы .txt, чтобы удалить ненужные теги.
Короче говоря, моя цель состоит в том, чтобы указать python перебирать загруженные файлы .txt (например, все те, что находятся в одной папке, или просто предоставляя справочный список .txt со всеми именами файлов), открывать каждый из них, искать слово «кумулятивный эффект» (идеально сочетается с другими ключевыми словами, см. код ниже), извлеките 5 строк до и после него, а затем экспортируйте результат в Excel с именем файла в столбце A и извлеченным абзацем в столбце B.
Используя этот код, мне удалось извлечь 5 строк выше и ниже ключевого слова «кумулятивный эффект» для одного файла .txt (который вы можете найти здесь для справки). Однако я все еще борюсь с автоматизацией/зацикливанием всего процесса и экспортом извлеченного текста в Excel с помощью pandas.
import collections
import itertools
import sys
from pandas import DataFrame
filing='0000950123-94-002010_1.txt'
#with open(filing, 'r') as f:
with open(filing, 'r', encoding='utf-8', errors='replace') as f:
before = collections.deque(maxlen=5)
for line in f:
if ('cumulative effect' in line or 'Cumulative effect' in line) and ('accounting change' in line or 'adoption' in line or 'adopted' in line or 'charge' in line):
sys.stdout.writelines(before)
sys.stdout.write(line)
sys.stdout.writelines(itertools.islice(f, 5))
break
before.append(line)
findings = {'Filing': [filing],
'Extracted_paragraph': [line]
}
df = DataFrame(findings, columns= ['Filing', 'Extracted_paragraph'])
export_excel = df.to_excel (r'/Users/myname/PYTHON/output.xlsx', index = None, header=True)
print (df)
Используя эту строку кода, я получаю нужный мне абзац, но мне удалось экспортировать только одну строку, в которой содержится ключевое слово, а не весь текст. Это вывод питона и это экспортированный текст в Excel.
Как мне создать цикл и правильно экспортировать весь интересующий абзац в Excel? Заранее большое спасибо!!
@JackFleeting да, в основном меня интересует только 11-строчный диапазон со строкой, в которой ключевое слово содержится в середине (т.е. 5 строк, строка с ключевым словом, 5 строк). И Prune я извиняюсь за это, я постараюсь сделать это более кратким и ясным
Я считаю, что ваша основная ошибка была в
'Extracted_paragraph': [line]
что должно было быть
'Extracted_paragraph': [before]
Таким образом, с некоторыми упрощающими изменениями основная часть вашего кода должна выглядеть так:
with open(filing, 'r', encoding='utf-8', errors='replace') as f:
before = collections.deque(maxlen=5)
for line in f:
if ('cumulative effect' in line or 'Cumulative effect' in line) and ('accounting change' in line or 'adoption' in line or 'adopted' in line or 'charge' in line):
break
before.append(line)
before = ''.join(before)
findings = {'Filing': [filing],
'Extracted_paragraph': [before]
}
df = DataFrame(findings, columns= ['Filing', 'Extracted_paragraph'])
А затем продолжите экспортировать в Excel и т. д.
Спасибо за предложения! Я расширил ваш подход, чтобы также вывести строку с ключевым словом и последующие 5 строк в виде 3 разных ячеек, которые позже я собираюсь объединить вручную! Вы случайно не знаете, как я могу теперь автоматизировать этот процесс для всех моих файлов .txt и указать python добавлять каждый результат в конец excel? Я попытался создать справочный файл со всеми именами файлов .txt, но я не знаю, как создать цикл в python. Заранее спасибо!
@Inrd - Трудно сказать абстрактно, но я бы начал с создания списка под названием filings
, который включает имя каждого текстового файла. Затем окружите весь код выше for file in filings: [run that code]
. В принципе, это должно работать, но реализация может занять некоторое время.
Вас интересуют ТОЛЬКО 5 строк до и после первой строки, в которых появляется фраза?