Как искать комбинацию ключевых слов в текстовом файле, извлекать строки выше и ниже, а затем экспортировать в Excel с помощью панд

Я пытаюсь извлечь 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? Заранее большое спасибо!!

Вас интересуют ТОЛЬКО 5 строк до и после первой строки, в которых появляется фраза?

Jack Fleeting 15.05.2019 18:03

@JackFleeting да, в основном меня интересует только 11-строчный диапазон со строкой, в которой ключевое слово содержится в середине (т.е. 5 строк, строка с ключевым словом, 5 строк). И Prune я извиняюсь за это, я постараюсь сделать это более кратким и ясным

lnrd 15.05.2019 18:52
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
496
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я считаю, что ваша основная ошибка была в

'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. Заранее спасибо!

lnrd 15.05.2019 21:34

@Inrd - Трудно сказать абстрактно, но я бы начал с создания списка под названием filings, который включает имя каждого текстового файла. Затем окружите весь код выше for file in filings: [run that code]. В принципе, это должно работать, но реализация может занять некоторое время.

Jack Fleeting 15.05.2019 21:51

Другие вопросы по теме