簡體   English   中英

從 python 中的文本文件中提取和組織數據

[英]Extracting and organising data from text file in python

Python 新手在這里。

我有一個文本文件,其中包含從 HTML(通過 BeautifulSoup 的 get_text() 方法)中提取的數據,我想從中提取信息。 問題是有很多我不感興趣的信息,只想摘取症結。

文本文件數據示例如下:

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

我還想組織許多其他值(鈣只是一個例子)。 我對DATE、TIME 和 VALUE感興趣,而忽略其他一切。

問題在 Python 中使用哪個 package 從文本數據中提取數據最強大?

編輯:

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 個值才能解包

一個友好的小提示,確定你是新手,但如果你設法用 BeautifulSoup 提取這個,你肯定有能力自己弄清楚這個。

照這樣說。

Python 非常適合在沒有 package 的情況下做這些事情,這使得它很容易適應你手頭的數據。 為任何特定需求制作自定義解析器根本不需要很長時間,特別是如果它是基於文本的。 除非您有數以百萬計的行,否則自定義解析器方法會起作用,並且您將始終能夠完成工作。

首先將您的數據放入文本行列表中。

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)

和 output:

[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')]

使用這樣的方法,也很容易將浮點數轉換為數字,將日期和時間字符串轉換為日期時間對象等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM