如何在Python中使用分号或斜杠分隔特定的细节?
我从兽医分析仪得到以下结果 结果{类型:PT/APTT;错误:0;PT:32.3s;INR:0.0;APTT:119.2;代码:470433200;批次:405 4H0401;日期:20/01/2017 06:47;PID:TREKKER20;索引:015;C1:-0.1;C2:-0.1;qclock:0;ta 目标:2;姓名:;性别:;出生日期:;操作员ID:;序号:024000G0900046;版本:V2.8.0.09}如何在Python中使用分号或斜杠分隔特定的细节?,python,Python,我从兽医分析仪得到以下结果 结果{类型:PT/APTT;错误:0;PT:32.3s;INR:0.0;APTT:119.2;代码:470433200;批次:405 4H0401;日期:20/01/2017 06:47;PID:TREKKER20;索引:015;C1:-0.1;C2:-0.1;qclock:0;ta 目标:2;姓名:;性别:;出生日期:;操作员ID:;序号:024000G0900046;版本:V2.8.0.09} 使用Python如何区分日期和时间类型PT和APTT。。。。请注意,每
使用Python如何区分日期和时间类型PT和APTT。。。。请注意,每次结果都会不同,因此我需要制作一个代码,使用/查找日期,并获得时间,因为有四位数字和:。。。。我使用for循环吗 如果要用分号拆分结果:
result_array = result.split(';')
在results\u array中,所有字符串都用分号分隔,然后可以访问其中的日期:
result\u array[index]
此代码通过将字段转换为dict
来简化字段的进一步使用
from pprint import pprint
result = "result{type:PT/APTT;error:0;PT:32.3 s;INR:0.0;APTT:119.2;code:470433200;lot:405 4H0401;date:20/01/2017 06:47;PID:TREKKER20;index:015;C1:-0.1;C2:-0.1;qclock:0;ta rget:2;name:;Sex:;BirthDate:;operatorID:;SN:024000G0900046;version:V2.8.0.09}"
if result.startswith("result{") and result.endswith("}"):
result = result[(result.index("{") + 1):result.index("}")]
# else:
# raise ValueError("Invalid data '" + result + "'")
# Separate fields
fields = result.split(";")
# Separate field names and values
# First part is the name of the field for sure, but any additional ":" must not be split, as example "date:dd/mm/yyyy HH:MM" -> "date": "dd/mm/yyyy HH:MM"
fields = [field.split(":", 1) for field in fields]
fields = {field[0]: field[1] for field in fields}
a = fields['type'].split("/")
print(fields)
pprint(fields)
print(a)
结果是:
{'type': 'PT/APTT', 'error': '0', 'PT': '32.3 s', 'INR': '0.0', 'APTT': '119.2', 'code': '470433200', 'lot': '405 4H0401', 'date': '20/01/2017 06:47', 'PID': 'TREKKER20', 'index': '015', 'C1': '-0.1', 'C2': '-0.1', 'qclock': '0', 'ta rget': '2', 'name': '', 'Sex': '', 'BirthDate': '', 'operatorID': '', 'SN': '024000G0900046', 'version': 'V2.8.0.09'}
{'APTT': '119.2',
'BirthDate': '',
'C1': '-0.1',
'C2': '-0.1',
'INR': '0.0',
'PID': 'TREKKER20',
'PT': '32.3 s',
'SN': '024000G0900046',
'Sex': '',
'code': '470433200',
'date': '20/01/2017 06:47',
'error': '0',
'index': '015',
'lot': '405 4H0401',
'name': '',
'operatorID': '',
'qclock': '0',
'ta rget': '2',
'type': 'PT/APTT',
'version': 'V2.8.0.09'}
['PT', 'APTT']
请注意,字典没有排序(在大多数情况下,通过键访问字段时不需要排序)。这是一种很糟糕的数据存储格式,因为字段的值中可能有冒号,但如果必须这样做,可以去掉周围的结果,用分号分割其余的结果,然后在冒号上进行单个拆分以获得
dict
键值对,然后仅从中构建dict
,例如:
data = "result{type:PT/APTT;error:0;PT:32.3 s;INR:0.0;APTT:119.2;code:470433200;lot:405 " \
"4H0401;date:20/01/2017 06:47;PID:TREKKER20;index:015;C1:-0.1;C2:-0.1;qclock:0;ta " \
"rget:2;name:;Sex:;BirthDate:;operatorID:;SN:024000G0900046;version:V2.8.0.09}"
parsed = dict(e.split(":", 1) for e in data[7:-1].split(";"))
print(parsed["APTT"]) # 119.2
print(parsed["PT"]) # 32.3 s
print(parsed["date"]) # 20/01/2017 06:47
如果需要将日期字段进一步分隔为日期和时间,可以执行date,time=parsed[“date”].split()
,但如果要操作对象,我建议您使用datetime
模块对其进行解析,例如:
import datetime
date = datetime.datetime.strptime(parsed["date"], "%d/%m/%Y %H:%M")
print(date) # 2017-01-20 06:47:00
print(date.year) # 2017
print(date.hour) # 6
# etc.
要直截了当地获取您的类型、PT、APTT、日期和时间,请使用re:
import re
from source import result_gen
result = result_gen()
def from_result(*vars):
regex = re.compile('|'.join([f'{re.encode(var)}:.*?;' for var in vars]))
matches =dict(f.group().split(':', 1) for f in re.finditer(regex, result))
return tuple(matches[v][:-1] for v in vars)
type, PT, APTT, datetime = from_result('type', 'PT', 'APTT', 'date')
date, time = datetime.split()
请注意,如果您突然对字符串中的某个其他“var”感兴趣,则可以很容易地对其进行扩展
简言之,您可以通过在regex搜索中捕获组来进一步优化这一点(以避免拆分步骤) 这是非常浪费的,Python3.6+只能引导。@zwer哪一个更浪费:处理整个字符串还是直接进入所需的数据?您可以轻松地将格式化字符串替换为str.format或其他旧样式。Python3.6在任何情况下都是永远存在的…以这种方式使用正则表达式是非常浪费的-您还需要处理整个字符串(至少直到匹配为止),并且处理了4次(或者更多,性能取决于输入变量),您只是没有直接注意到它,因为正则表达式引擎在C端运行。这可能,只是可能最终执行得比拆分几个值更快(再次感谢C端),但对于每一个附加值,它将经历更多的线性减速。如果你想一个接一个地提取变量,不妨使用本机字符串搜索,它的搜索速度会比正则表达式快好几倍。此外,Python 3.6已经问世不到8个月了,除非你是一只很难归类为永久的蜉蝣。你到底在说什么?因为它只是Python3.6,所以我们不应该使用为我们提供的便利?我已经说过,如果您设想您的代码在旧版本中运行,那么您可以使用其他方法。那根本不是问题。我不喜欢给东西总是一字不差地使用。我更喜欢给出声音和全面的提示…谢谢它运行我的脚本,但我现在得到一个错误它说AttributeError:'str'对象没有attirbute'str'哪个语句给你错误?还要注意的是,我更正了我在
fields={field[0]:field[1]行中的打字错误(已编辑),它是field[1://code>而不是field[1]
,但是,当我使用Python 3.6.1运行此命令时,不会导致此错误。它给出了语句fields=result.split(;)上的错误我使用的是python 2,这可能是问题所在吗?这很奇怪。我将上面的代码复制粘贴到,它给出了相同的结果。请尝试在抛出错误的语句上方的print(result)
(或print result
)检查您的输入内容。啊,是的,我明白了,我不知道为什么它仍然不断给我相同的错误。。这可能是因为它从我的代码的其余部分中发现了错误?