Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中使用分号或斜杠分隔特定的细节?_Python - Fatal编程技术网

如何在Python中使用分号或斜杠分隔特定的细节?

如何在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。。。。请注意,每

我从兽医分析仪得到以下结果

结果{类型: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。。。。请注意,每次结果都会不同,因此我需要制作一个代码,使用/查找日期,并获得时间,因为有四位数字和:。。。。我使用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
)检查您的输入内容。啊,是的,我明白了,我不知道为什么它仍然不断给我相同的错误。。这可能是因为它从我的代码的其余部分中发现了错误?