【问题标题】:Verification of variables received from a sensor验证从传感器接收的变量
【发布时间】:2014-07-18 21:02:02
【问题描述】:

我有一个设备可以输出几个通常如下所示的值:

-1.6410,0.5390,0.5570
-1.6160,0.3860,0.5620
-1.4890,-0.0760,0.5260
-1.4120,-0.1740,0.5290
-1.2920,-0.2160,0.6110
-1.2520,-0.2510,0.6450
-1.2530,-0.2270,0.6330
-1.2670,-0.2220,0.6530
-1.2350,-0.2250,0.7170
-1.4470,-0.3840,0.2400
-1.2670,-0.7480,0.0630
-1.0690,-0.9340,-0.1400
-0.9440,-1.0000,-0.2440

这三个数字可以是任意长度,可以是正数也可以是负数。有没有办法(在 Python 中)检查是否返回了有效数字而不是文本字符串(如“CHECKSUM ERROR”等)?我不知道可能会收到什么文本错误,所以我想尝试验证是否收到了号码。这可能吗?

我曾为每个变量考虑过一个简单的 IF 语句,但这似乎很笨拙。例如:

if (value1 > -9999) and (value1 < 9999):
...

我必须对这三个值中的每一个都执行此操作。有没有更简单的方法?

【问题讨论】:

标签: python variables multiple-conditions


【解决方案1】:

你可以通过正则表达式传递每一行

import re

valid_pattern = re.compile('-?\d\.\d+,-?\d\.\d+,-?\d\.\d+')

for line in lines:
    if valid_pattern.match(line):
        x,y,z = map(float(line.split(","))
    else:
        pass #ignore the line, maybe print a warning whatever

【讨论】:

  • 你甚至可以让正则表达式做基本的边界检查,例如如果小数点前的数字只能为0或1,则使用-?[01]\.\d+
  • 这是做什么的? -?\d\.\d+
  • 我假设您要么不熟悉一般的正则表达式,要么不熟悉 python 特定的语法。如果是前者,则正则表达式是具有特殊(因语言而异)描述字符串可以匹配的模式的字符串。如果您不熟悉 python 语法,请参阅docs.python.org/2/library/re.html 以获得完整描述,但我将描述我的正则表达式 "-?\d\.\d+,-?\d\.\d+,-?\d \.\d+"。您可以看到“-?\d\.\d+”部分重复了。每个重复描述一个浮点数。 -? -> 可选减号(? 表示前面的字符是可选的)
  • \d -> 0 到 9 之间的任意数字; \。表示句点(. 没有反斜杠匹配任何单个字符); \d+ -> 一位或多位数字 (0-9)(+ 表示前面的一位或多位字符)
  • 谢谢,我想我不熟悉正则表达式。非常感谢您花时间解释这一点。
【解决方案2】:

解决方案可以很简单:尝试获取值,如果失败(抛出一些预测的异常),则将其视为无效条目并忽略它。

lines = """
-1.6410,0.5390,0.5570
-1.6160,0.3860,0.5620
-1.4890,-0.0760,0.5260
-1.4120,-0.1740,0.5290
-1.2920,-0.2160,0.6110
-1.2520,-0.2510,0.6450
-1.2530,-0.2270,0.6330
-1.2670,-0.2220,0.6530
-1.2350,-0.2250,0.7170
-1.4470,-0.3840,0.2400
-1.2670,-0.7480,0.0630
BAD GUY WAS HERE
-1.0690,-0.9340,-0.1400
-0.9440,-1.0000,-0.2440
"""

for line in lines.strip().split("\n"):
    try:
        x, y, z = map(float, line.split(","))
        # continue processing here
        print x, y, z
    except ValueError:
        print "I do not like this line", line
        continue

【讨论】:

  • @LucasScott 请注意,与正则表达式解决方案相比,此解决方案只需简单的尝试 - except 更快。在 Python 中,这是一种非常常见的模式(它可以让代码保持简单、快速和可读)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
  • 2020-04-28
  • 1970-01-01
相关资源
最近更新 更多