用python从文本文件中提取和组织数据

用python从文本文件中提取和组织数据,python,parsing,web-scraping,beautifulsoup,text-files,Python,Parsing,Web Scraping,Beautifulsoup,Text Files,这里是Python新手 我有一个文本文件,其中包含从HTML(通过BeautifulSoup的get_text()方法)中提取信息的临时数据。问题是有很多我不感兴趣的信息,我只想找出症结所在 文本文件数据示例如下所示: EpisodeST02432293 Date collected18/02/2019 Time collected03:15 Calcium 2.01 L mmol/L 2.15 - 2.50 Episode

这里是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
我还想组织很多其他价值观(钙只是一个例子)。我对日期、时间和价值感兴趣,而忽略其他一切

问题 在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个以上的值才能解包


一个小的友好的nugde,当然你是一个新手,但是如果你用BeautifulSoup提取了这个,你肯定有能力自己解决这个问题

尽管如此

Python非常适合在没有软件包的情况下完成这些工作,它可以很容易地适应手头的任何数据。对于任何特定的需求,特别是基于文本的需求,定制解析器并不需要很长时间。除非您有十分之一的行,否则定制解析器方法可以工作,并且您将始终能够完成这项工作

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)
首先,以一种只将数据放入文本行列表的方式创建数据

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

使用这种方法,还可以很容易地将浮点转换为数字,将日期和时间字符串转换为日期时间对象等。

在Python中,从文本数据提取数据时,哪个包最强大?请求库/软件推荐显然是离题的。请参阅:,。如果我发布的代码出现错误,则实际上可以保证数据与您发布的数据不同。你只需要在找到这些边缘时进行调整。另一件事,您在代码中试图解包为变量名,该变量名在代码中初始化为None。为什么会这样?谢谢你的评论。我将调查这些错误。谢谢。我试图格式化数据,将其添加到一个带有key=eposion、values=date、time、result的字典中,但我一无所获。只想在这里询问您的代码:名称、值、*.=row.split()。*u出现语法错误?应在py3.6及以上版本上使用*u,您使用的是哪个版本?我不确定你在用**和字典做什么很容易。谢谢。我试着在我出错的地方加粗。我非常喜欢你的元组思想,因为我不需要更改任何数据,只需要格式化、解析和呈现它。谢谢你的帮助!我刚刚将python更新为3.7