Извлечение и организация данных из текстового файла в python - PullRequest
0 голосов
/ 22 февраля 2020

Python newb ie здесь.

У меня есть текстовый файл со соскребенными данными из HTML (с помощью метода get_text () BeautifulSoup), из которого я хочу извлечь информацию. Проблема в том, что есть много информации, которая меня не интересует, и я хочу только извлечь суть.

Пример данных текстового файла:

EpisodeST02432293
Date collected18/02/2019
Time collected03:15

       Calcium       2.01 L    mmol/L                  2.15 - 2.50


EpisodeST02430416
Date collected16/02/2019
Time collected04:00

       Calcium       1.97 L    mmol/L                  2.15 - 2.50
EpisodeST02429201
Date collected15/02/2019
Time collected

       Calcium       1.96 L    mmol/L                  2.15 - 2.50
EpisodeST02424551
Date collected14/02/2019
Time collected00:30

       Calcium       1.93 L    mmol/L                  2.15 - 2.50
EpisodeST02423863
Date collected13/02/2019
Time collected

Существует множество других значения, которые я также хочу организовать (кальций это только пример). Я заинтересован в ДАТА, ВРЕМЯ и ЗНАЧЕНИЕ , игнорируя все остальное.

ВОПРОС Какой пакет является самым мощным в Python для извлечения данных из текстовые данные?

РЕДАКТИРОВАТЬ:

DS = namedtuple('DS', 'date time name value')
parsed = list()
idx_date = [i for i, r in enumerate(data) if r.strip().startswith('Date')]

for start, stop in zip(idx_date[:-1], idx_date[1:]):
    chunk = data[start:stop]
    date = time = name = value = None
    for row in chunk:
        if not row: continue
        row = row.strip()
        if row.startswith('Episode'): continue
        if row.startswith('Date'):
            _, date = row.split()
            date = date.replace('collected', '')
        elif row.startswith('Time'):
            _, time = row.split()
            time = time.replace('collected', '')
        else:
            **name, value, _* = row.split()**
    parsed.append(DS(date, time, name, value))

print(parsed)

Этот код выдает ошибку:

ValueError: для распаковки требуется более 0 значений

1 Ответ

1 голос
/ 22 февраля 2020

Маленький дружелюбный нугде, конечно, вы новичок ie, но если вам удалось извлечь это с BeautifulSoup, у вас наверняка есть возможность выяснить это самостоятельно.

С Тем не менее.

Python идеально подходит для выполнения этих задач без пакета, что позволяет очень легко адаптироваться к тому, что у вас под рукой с точки зрения данных. Создание собственного синтаксического анализатора для любых конкретных нужд * занимает совсем немного времени, особенно если оно основано на тексте. Если у вас нет десятков миллионов строк, пользовательский подход синтаксического анализатора работает, и вы всегда сможете выполнить работу.

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

data = """
EpisodeST02432293
Date collected18/02/2019
Time collected03:15

       Calcium       2.01 L    mmol/L                  2.15 - 2.50


EpisodeST02430416
Date collected16/02/2019
Time collected04:00

       Calcium       1.97 L    mmol/L                  2.15 - 2.50
EpisodeST02429201
Date collected15/02/2019
Time collected

       Calcium       1.96 L    mmol/L                  2.15 - 2.50
EpisodeST02424551
Date collected14/02/2019
Time collected00:30

       Calcium       1.93 L    mmol/L                  2.15 - 2.50
EpisodeST02423863
Date collected13/02/2019
Time collected
"""

вот версия, которая выполняет свою работу.

from collections import namedtuple

data = data.splitlines()

DS = namedtuple('DS', 'date time name value')
parsed = list()

idx_date = [i for i, r in enumerate(data) if r.strip().startswith('Date')]

for start, stop in zip(idx_date[:-1], idx_date[1:]):
    chunk = data[start:stop]
    date = time = name = value = None
    for row in chunk:
        if not row: continue
        row = row.strip()
        if row.startswith('Episode'): continue
        if row.startswith('Date'):
            _, date = row.split()
            date = date.replace('collected', '')
        elif row.startswith('Time'):
            _, time = row.split()
            time = time.replace('collected', '')
        else:
            name, value, *_ = row.split()
    parsed.append(DS(date, time, name, value))

print(parsed)

и вывод:

[DS(date='18/02/2019', time='03:15', name='Calcium', value='2.01'),
 DS(date='16/02/2019', time='04:00', name='Calcium', value='1.97'),
 DS(date='15/02/2019', time='', name='Calcium', value='1.96'),
 DS(date='14/02/2019', time='00:30', name='Calcium', value='1.93')]

при таком подходе его также легко поместить в float преобразование в числа, создание строк даты и времени в объектах datetime и т. д. c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...