我有一个读取温度数据的脚本:
def get_temp(socket, channels):
data = {}
for ch in channels:
socket.sendall('KRDG? %s\n' % ch)
time.sleep(0.2)
temp = socket.recv(32).rstrip('\r\n')
data[ch] = float(temp)
有时,脚本会在将值转换为float的行上失败:
文件“./projector.py”,第129行,在get_temp中 data [ch] = float(temp)
ValueError:float()的文字无效:+ 135.057E + 0
+ 078.260E + 0
00029
但这不是无效的文字。如果我把它输入任何python shell,
float(+135.057E+0)
然后它正确返回135.057。
那么问题是什么?
答案 0 :(得分:11)
我几乎可以保证问题是某种非打印字符,它存在于你从套接字中取出的值中。看起来你正在使用Python 2.x,在这种情况下你可以用它来检查它们:
print repr(temp)
你可能会看到\x00
形式的某些内容被转义。当您直接打印到控制台时,这些非打印字符不会显示,但它们的存在足以对将字符串值解析为浮点数产生负面影响。
- 针对问题更改进行了编辑 -
这对于你的问题来说这部分是准确的 - 但根本原因似乎是你正在阅读比你预期的套接字更多的信息或以其他方式接收多个值。你可以做点什么
map(float, temp.strip().split('\r\n'))
为了转换每个值,但如果你的函数应该返回一个浮点值,这可能会引起混淆。无论如何,这个问题肯定围绕着你从套接字中检索到的值中不希望看到的字符的存在。
答案 1 :(得分:0)
我在从数字刻度读取串行输出时遇到了类似的问题。我正在用18个字符长的输出字符串阅读[3:12]。
在我的情况下,有时会出现一个空字符" \ x00" (NUL)神奇地出现在音阶的回复字符串中并且不打印。
我收到了错误:
> ' 0.00'
> 3 0 fast loop, delta = 10.0 weight = 0.0
> ' 0.00'
> 1 800 fast loop, delta = 10.0 weight = 0.0
> ' 0.00'
> 6 0 fast loop, delta = 10.0 weight = 0.0
> ' 0\x00.0'
> Traceback (most recent call last):
> File "measure_weight_speed.py", line 172, in start
> valueScale = float(answer_string)
> ValueError: invalid literal for float(): 0
经过一些研究后,我写了几行代码,在我的案例中有用。
replyScale = scale_port.read(18)
answer = replyScale[3:12]
answer_decode = answer.replace("\x00", "")
answer_strip = str(answer_decode.strip())
print(repr(answer_strip))
valueScale = float(answer_strip)
这些帖子中的答案有助于:
答案 2 :(得分:0)
当心自变量中可能出现的意外文字
例如,您可以在参数中留一个空格,将其呈现为字符串/文字:
float(' 0.33')
确保不要在意想不到的空格中加入参数后,我留下了:
float(0.33)
像这样,它就像一个护身符。
带走是: 请注意输入中的意外文字(例如,您没有看到的空格)。