[英]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.