Python 结构化字符串中提取数据详情

目录
  • 前言
  • 从结构化字符串中提取数据
    • 字符串解析

前言

在许多自动化任务中,我们都需要从已知格式结构化的输入文本中提取相关信息。例如,我们可能需要在一段电影评论数据中提取观影时间、电影名、评分等信息,以便存储后进行进一步分析。在本节中,我们将以提取电影评论数据信息为例讲解如何从结构化字符串中提取数据。

从结构化字符串中提取数据

假设我们具有以下结构的电影评分数据,我们需要解析存储观影时间、电影名、评分等信息:

[<Timestamp>] - MOVIE ID: <movie id> - MOVIE NAME: <movie name> - SCORE: <score of the movie>

例如,一条可能的电影评分记录如下所示:

[2022-08-01T11:58:41.504054] - MOVIE ID: 00015 - MOVIE NAME: Inception - SCORE: 8.5

其中,我们使用标准格式表示时间和日期,这在计算机中广泛应用。

字符串解析

首先,导入所需库,并给出所需解析的用户对电影的评分记录:

>>> import delorean
>>> from decimal import Decimal
>>> text = '[2022-08-01T11:58:41.504054] - MOVIE ID: 00015 - MOVIE NAME: Inception - SCORE: 8.5'

将评分记录使用 split() 方法拆分为多个部分,我们使用 “-” 作为分隔符拆分每个元素,将评分记录拆分为 4 部分——时间戳、电影 ID、电影名和电影评分,便于之后将它们解析为正确的类型:

>>> divided_text = text.split(' - ')
>>> divided_text
['[2022-08-01T11:58:41.504054]', 'MOVIE ID: 00015', 'MOVIE NAME: Inception', 'SCORE: 8.5']
>>> timestamp, movie_id, movie_name, score = divided_text

将时间戳解析为 datetime 对象。由于在评分记录中时间戳包含在方括号中,为了正确解析时间戳,需要去掉括号,然后使用 delorean 模块将其解析为日期时间对象:

>>> timestamp = delorean.parse(timestamp.strip('[]'))
>>> timestamp
Delorean(datetime=datetime.datetime(2022, 1, 8, 11, 58, 41, 504054), timezone='UTC')

将 movie_id 解析为整数。为了解析电影 ID,需要使用冒号作为分隔符拆分 movie_id,然后,将最后一个元素解析为整数:

>>> movie_id = int(movie_id.split(':')[-1])
>>> movie_id
15

将评分解析为 Decimal 类型。为了解析电影评分,我们同样使用冒号作为分隔符拆分 score,并将其解析为十进制字符对象 Decimal (这是由于此值解析为浮点类型会改变精度):

>>> score = Decimal(score.split(':')[-1])
>>> score
Decimal('8.5')

为了便于解析和聚合,我们可以将所解析的数据组合在一起成为一个对象。例如,我们可以通过在 Python 代码中定义一个类,来方便的解析和聚合结构化字符串中的数据:

class Movie(object):
    def __init__(self, timestamp, movie_id, movie_name, score):
        self.timestamp = timestamp
        self.movie_id = movie_id
        self.movie_name = movie_name
        self.score = score

    def __repr__(self):
        return '<Movie ({}, {}, {})>'.format(self.timestamp, self.movie_id, self.movie_name, self.score)

    @classmethod
    def parse(cls, text):
        '''
        Parse from a text with the format
        [<Timestamp>] - MOVIE ID: <movie id> - MOVIE NAME: <movie name> - SCORE: <score of the movie>
        to a Movie object
        '''
        divided_text = text.split(' - ')
        timestamp, movie_id, movie_name, score = divided_text
        timestamp = delorean.parse(timestamp.strip('[]'))
        movie_id = int(movie_id.split(':')[-1])
        movie_name = movie_name.split(':')[-1]
        score = Decimal(score.split(':')[-1])
        return cls(timestamp=timestamp, movie_id=movie_id, movie_name=movie_name, score=score)

定义 Movie 类完成后,我们可以使用以下方式方便的对评分记录进行解析:

>>> Movie.parse(text)
<Movie (Delorean(datetime=datetime.datetime(2022, 1, 8, 11, 58, 41, 504054), timezone='UTC'), 15,  Inception)>

到此这篇关于Python 结构化字符串中提取数据详情的文章就介绍到这了,更多相关Python 提取数据内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python提取具有某种特定字符串的行数据方法

    今天又帮女朋友处理了一下,她的实验数据,因为python是一年前经常用,最近找工作,用的是c,c++,python的有些东西忘记了,然后就一直催我,说我弄的慢,弄的慢,你自己弄啊,烦不烦啊,逼逼叨叨的,最后还不是我给弄好的?呵呵 好的,数据是这样的,我截个图 我用红括号括起来的,就是我所要提取的数据 其中lossstotal.txt是我要提取的原始数据,考虑两种方法去提取,前期以为所要提取行的数据是有一定规律的,后来发现,并不是,所以,我考虑用正则来提取,经过思考以后,完成了数据的提取,如下午所

  • python提取包含关键字的整行数据方法

    问题描述: 如下图所示,有一个近2000行的数据表,需要把其中含有关键字'颈廓清术,中央组(VI组)'的数据所在行都都给抽取出来,且提取后的表格不能改变原先的顺序. 问题分析: 一开始想用excel的筛选功能,但是发现只提供单列筛选,由于关键词在P,S,V,Y,AB列都有,故需要筛选5次.但是筛选完后再整合再一起的表格顺序就乱了,而原先的表格排序规律不可知,无法通过简单的排序实现.于是决定用Python写个代码来解决这个问题~ python生成的表格是这个样子滴^_^那些空白的行就是不符合要求的

  • 使用python提取html文件中的特定数据的实现代码

    例如 具有如下结构的html文件 复制代码 代码如下: <div class='entry-content'> <p>感兴趣内容1</p> <p>感兴趣内容2</p> -- <p>感兴趣内容n</p> </div> <div class='content'> <p>内容1</p> <p>内容2</p> -- <p>内容n</p>

  • Python提取特定时间段内数据的方法实例

    python提取特定时间段内的数据 尝试一下: data['Date'] = pd.to_datetime(data['Date']) data = data[(data['Date'] >=pd.to_datetime('20120701')) & (data['Date'] <= pd.to_datetime('20120831'))] 实际测试 ''' Created on 2019年1月3日 @author: hcl ''' import pandas as pd import

  • Python 结构化字符串中提取数据详情

    目录 前言 从结构化字符串中提取数据 字符串解析 前言 在许多自动化任务中,我们都需要从已知格式结构化的输入文本中提取相关信息.例如,我们可能需要在一段电影评论数据中提取观影时间.电影名.评分等信息,以便存储后进行进一步分析.在本节中,我们将以提取电影评论数据信息为例讲解如何从结构化字符串中提取数据. 从结构化字符串中提取数据 假设我们具有以下结构的电影评分数据,我们需要解析存储观影时间.电影名.评分等信息: [<Timestamp>] - MOVIE ID: <movie id>

  • python正则表达式从字符串中提取数字的思路详解

    python从字符串中提取数字 使用正则表达式,用法如下: ## 总结 ## ^ 匹配字符串的开始. ## $ 匹配字符串的结尾. ## \b 匹配一个单词的边界. ## \d 匹配任意数字. ## \D 匹配任意非数字字符. ## x? 匹配一个可选的 x 字符 (换言之,它匹配 1 次或者 0 次 x 字符). ## x* 匹配0次或者多次 x 字符. ## x+ 匹配1次或者多次 x 字符. ## x{n,m} 匹配 x 字符,至少 n 次,至多 m 次. ## (a|b|c) 要么匹配

  • python从PDF中提取数据的示例

    01 前言 数据是数据科学中任何分析的关键,大多数分析中最常用的数据集类型是存储在逗号分隔值(csv)表中的干净数据.然而,由于可移植文档格式(pdf)文件是最常用的文件格式之一,因此每个数据科学家都应该了解如何从pdf文件中提取数据,并将数据转换为诸如"csv"之类的格式,以便用于分析或构建模型. 在本文中,我们将重点讨论如何从pdf文件中提取数据表.类似的分析可以用于从pdf文件中提取其他类型的数据,如文本或图像.我们将说明如何从pdf文件中提取数据表,然后将其转换为适合于进一步分

  • python每5分钟从kafka中提取数据的例子

    我就废话不多说了,直接上代码吧! import sys sys.path.append("..") from datetime import datetime from utils.kafka2file import KafkaDownloader import os """ 实现取kafka数据,文件按照取数据的间隔命名 如每5分钟从kafka取数据写入文件中,文件名为当前时间加5 """ TOPIC = "rtz

  • python实现将字符串中的数字提取出来然后求和

    因工作原因,很久没有学习python知识了,感觉都快忘记了,前天看到一个练习题,如何将字符串中的数字提取出来,然后求和呢?下面我来解释一下如何通过python代码来实现. 题目:字符串43...3y2.f67se2.666. 将其中的所有数字提取出来然后求和 思考: 1.字符串中包含了字母和数字和小数点,怎么取出来比较呢? 2.小数点连续有很多个的时候怎么处理? 3.最后取出来的数该怎么求和? 4.最后一个是小数点该怎么办? 解题思路: 1.首先通过循环遍历去将字符串中的数字取出来 2.去判断取

  • Python从csv文件中读取数据及提取数据的方法

    目录 1.从csv文件中读取数据 2.数据切割 数据保存在csv文件中 1.从csv文件中读取数据 参数header=None的有无 (1)没有header=None--直接将csv表中的第一行当作表头 # 读取数据 import pandas as pd data = pd.read_csv("data1.csv") print(data) 打印结果为: (2)有header=None--自动添加第一行当作表头 # 读取数据 import pandas as pd data = pd

  • python 正则表达式获取字符串中所有的日期和时间

    提取日期前的处理 1.处理文本数据的日期格式统一化 text = "2015年8月31日,衢州元立金属制品有限公司仓储公司(以下简称元立仓储公司)成品仓库发生一起物体打击事故,造成直接经济损失95万元." text1 = "2015/12/28下达行政处罚决定书" text2 = "2015年8月发生一起物体打击事故" # 对文本处理一下 # 2015-8-31 2015-12-28 text = text.replace("年&quo

  • Python实现将SQLite中的数据直接输出为CVS的方法示例

    本文实例讲述了Python实现将SQLite中的数据直接输出为CVS的方法.分享给大家供大家参考,具体如下: 对于SQLite来说,目前查看还是比较麻烦,所以就像把SQLite中的数据直接转成Excel中能查看的数据,这样也好在Excel中做进一步分数据处理或分析,如前面文章中介绍的<使用Python程序抓取新浪在国内的所有IP>.从网上找到了一个将SQLite转成CVS的方法,贴在这里,供需要的朋友使用: import sqlite3 import csv, codecs, cStringI

  • Python正则表达式匹配字符串中的数字

    1.使用"\d+"匹配全数字 代码: import re zen = "Arizona 479, 501, 870. Carlifornia 209, 213, 650." m = re.findall("\d+", zen) print(m) 结果: ['479', '501', '870', '209', '213', '650'] 但是上述这种方式也会引入非纯数据,例子如下: import re zen = "Arizona 47

  • 浅谈如何使用vb.net从数据库中提取数据

    1.设置从Model中的Sub Main 启动 2.程序结构 3.Model1 Imports System.Windows.Forms.Application Module Module1 Sub Main() 'form1 是测试多文档窗口 'Dim frm1 As New Form1() 'frm1.Show() Dim formStudentSysMain As New FormStudentSysMain() formStudentSysMain.Show() Do While Tru

随机推荐