Python readline()返回不会转换为int或float的字符串

时间:2016-06-13 22:36:48

标签: python arduino raspberry-pi

我正在使用Arduino SoftwareSerial库将串行数据发送到Raspberry Rx引脚。我可以成功地将Arduino串行数据发送到Raspberry,因为我发送的整数作为字符串中的等价物到达。

问题:

我试图将.readline()返回的字符串转换为float或int,但我无法这样做。

import serial
oSer = serial.Serial("/dev/ttyAMA0",baudrate=57600,timeout=1)

while True:
    sInput = oSer.readline()
    print sInput #Returns: >>1,2,3,

    lsInput = sInput.split(',')
    print lsInput #Returns: >>['1','2','3','\r\n']

如何将其转换为int或float?我只需要对数字进行一些算术运算。我试过了:

    lfInput = [float(i) for i in lsInput] #Returns: >> ValueError: could not convert to float:

    liInput = [int(i) for i in lsInput] #Returns: >> ValueError: invalid literal for int() with base 10: ''

答案

感谢提供Answers的John和Padraic,我可以确认有关如何解决上述问题的更新。我更喜欢Padraic的解决方案,稍微优雅,但要么工作。我添加了以下内容:

John's,特别是Pad的解决方案(请参阅下面的答案以获得更好和更详细的信息):

sInput = oSer.readline().strip() #but see answers below from Pad for more detail

2 个答案:

答案 0 :(得分:3)

错误是由行末import serial oSer = serial.Serial("/dev/ttyAMA0",baudrate=9600,timeout=1) while True: sSerialInput = oSer.readline() print sSerialInput 引起的。 \r\nint()不喜欢这样。

您可以像这样剥离它:

float()

或者您可以修改循环以忽略非数字:

sInput = oSer.readline().strip()

答案 1 :(得分:1)

您可以rstrip尾随空格:

while True:
    sInput = oSer.readline().rstrip().split(",")

或者更强大的方法是查看是否可以使用try / except将元素强制转换为浮点数:

def cast(it):
    for ele in it:
        try:
            yield float(ele)
        except ValueError:
            pass


while True:
    sInput = oSer.readline().rstrip(",\r\n").split(",")
    nums = list(cast(sInput.split(",")))

cast适用于浮点数,整数和负数。