【问题标题】:if statement, print additional column in pythonif 语句,在 python 中打印附加列
【发布时间】:2017-05-10 23:45:46
【问题描述】:

我是 pythin 的新手,并试图为正在收集的一些数据制定一个 if 语句。

import grovepi
import time
import datetime
import grovelcd
#headerline
print ("Time,Noise (db),Light (lux),Temperature (C),Humidity (rH)")

这里我有已经存在的标题行,用于将它们打印到 csv 文件中。我想要另一个显示我在下面概述的信息。

while True:
  timestamp=time.time()
  #read from a analog sensor on input 1
  d= grovepi.analogRead(1)
  #read from an analog sensor on input 2
  a= grovepi.analogRead(2)
  #read from an digital sensor on input 3
  (t,h)=grovepi.dht(3,0)

以上是每个传感器的读数

print ("%f,%d,%d,%f,%f"%(timestamp,d,a,t,h))

我想要的是一个附加值,我在获取 if 语句以获取该值并确定它是否与我想要的匹配时遇到问题。所有这些都应该是数值。

我的想法是

if t > 35:
  print("Warning")
if h > 50:
  print("Warning")
if n > 75:
  print("Warning")
else:
  print("OK")

基本上我的输出看起来像这样:

Noise  Light   Temperature   Humidity
85      500        34           76

我想要实现的是:

Noise  Light   Temperature   Humidity  Note
85      500        34           76      OK

感谢任何帮助,不幸的是我不太了解python。

【问题讨论】:

  • 首先,没有内置的sprint()。此功能是否来自另一个模块?其次,if 语句中的else 仅指最后一个if。无论th 的值如何,只有n<=75 才会打印OK。如果想在没有警告的情况下打印OK,则需要重写最后一段代码。
  • 我已经更改了 sprint,我认为应该是 print

标签: python loops csv if-statement


【解决方案1】:

如果您想打印一个额外的列,例如“1234567890,34.3,51.2,70.3,Warning”,那么您可以使用简单的布尔变量来完成,如下所示:

while True:
    ...
    warning = t > 35 or h > 50 or n > 75
    print ("%f,%d,%d,%f,%f,%s" % (
        timestamp, d, a, t, h, "Warning" if warning else "OK"
    ))

在上面,我已将warning 定义为布尔条件,并使用 if 用于内联 if 运算符打印“警告”或“确定”。

如果您需要额外的灵活性,您可以分配给字符串变量:

while True:
    ...
    # Note, only message for the first matching condition would display
    if t > 35:
        message = "Warning: T"
    elif h > 50:
        message = "Warning: H"
    elif n > 75:
        message = "Warning: N"
    else:
        message = "OK"
    print ("%f,%d,%d,%f,%f,%s" % (timestamp, d, a, t, h, message))

如果你需要显示多条消息,你可以收集一个列表,像这样:

while True:
    ...
    warnings = []
    if t > 35:
        warnings.append("WarnT")
    if h > 50:
        warnings.append("WarnH")
    ...
    status = " ".join(warnings) if warnings else "OK"
    print ("%f,%d,%d,%f,%f,%s" % (timestamp, d, a, t, h, status))

这将收集一个列表中的所有警告(所以它就像["WarnT", "WarnH"]),然后如果列表不是空的,用空格连接(" ".join(warnings))所以它将是“WarnT WarnH”,否则使用“确定”作为消息。根据需要调整输出。

希望这会有所帮助。

(顺便说一句,如果您想要固定位数,您可以考虑使用 %0.2f 而不是 %f。我相信您可能想要四舍五入到一个合理的精度,例如“59.03”而不是什么比如“59.031045032”)

【讨论】:

  • 刚刚试用过,非常感谢。也很高兴了解更灵活的选项,非常有帮助。
  • 太棒了。另外,只是想指出您不需要在t, h = grovepi.dht(3, 0) 中使用括号,在t, h 周围。有括号并没有错误 - 只是它们是不必要的。
  • 谢谢,任何让它更整洁的东西都很棒。感谢您的帮助,python 的早期对我来说,但我会到达那里!