首页 > 解决方案 > 在python中,我如何为来自串行的每一行输出添加时间戳?

问题描述

我想记录来自串行硬件的输出数据的时间戳。我可以为来自串行的第一个实例添加时间戳,但不能为每一行记录。例如:现在,我可以记录时间戳,如下所示:


[2019-12-20 16:30:28]:$GV0040

?国标

[2019-12-20 16:30:28]:$GB00402eef

$GB00403eef

?国标

$GB00402eef

[2019-12-20 16:30:28] : *AQ0401


但我想要每一行的时间戳。如下所示:

[2019-12-20 16:30:28]:$GV0040

[2019-12-20 16:30:28] : ?GB

[2019-12-20 16:30:28]:$GB00402eef

[2019-12-20 16:30:28] : ?GB

[2019-12-20 16:30:28]:$GB00402eef

[2019-12-20 16:30:28] : ?GB

[2019-12-20 16:30:28]:$GB00402eef

[2019-12-20 16:30:28] : *AQ0401

在python的每一行上记录输出数据时间戳的方法是什么?

标签: python-3.xtimestamp

解决方案


我认为您应该检查每一行是否以正确格式的时间码开头。如果没有,请根据之前的时间码添加。

如果lines是生成器或包含串行的每一行,你可以做这样的事情。

from datetime import datetime

last_timecode = datetime.now()
time_format = '[%Y-%m-%d %H:%M:%S]'
for line in lines:
    parts = line.split(' :')
    if len(parts) > 1:
        try:
            datetime.strptime(parts[0], time_format)
            last_timecode = parts[0]
            print(line)
        except ValueError:
            print(f'{last_timecode} : {line}')
    else:
        print(f'{last_timecode} : {line}')

将其分解,我们取每一行,并尝试将其拆分为' :'. 原始行可能是以下任何类型:

  1. ?GB['?GB']分裂后变成
  2. ?GB : other['?GB', ' other']分裂后变成
  3. [2019-12-20 16:30:28] : *AQ0401['[2019-12-20 16:30:28]', '*AQ0401']分裂后变成

如果有多个部分并且第一部分与日期格式不匹配或只有一个部分,请在该行前面加上正确的日期。

否则,有多个部分,因此我们检查第一个是否匹配正确的日期格式。如果是这样,只需打印同一行(不更改),并保存日期,以供以后没有日期的行使用。


推荐阅读