温度データを読み取るスクリプトがあります。
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)
時々、スクリプトは値をフロートに変換する行で失敗します:
Get_tempの129行目の「./projector.py」ファイル
data [ch] = float(temp)
ValueError:float()の無効なリテラル:+ 135.057E + 0
+ 078.260E + 0
+ 00029
しかし、これは無効なリテラルではありません。これを任意のpython Shell、
float(+135.057E+0)
その後、135.057を正しく返します。
それで問題は何ですか?
私はすべて、問題がソケットから引き出された値に存在するある種の非印刷文字であることを保証します。 Python 2.xを使用しているように見えます。この場合、次のようにして確認できます。
print repr(temp)
おそらく、\x00
の形式でエスケープされたものがそこに表示されます。これらの非印刷文字は、コンソールに直接印刷しても表示されませんが、文字列値の解析から浮動小数点数に悪影響を与えるのに十分な存在です。
-質問の変更のために編集-
これはあなたの問題にとって部分的に正確です-しかし根本的な原因は、あなたがソケットから期待するよりも多くの情報を読んでいるか、さもなければ複数の値を受け取っていることです。次のようなことができます
map(float, temp.strip().split('\r\n'))
各値を変換するために、ただし関数が単一の浮動小数点値を返すことになっている場合、混乱を引き起こす可能性があります。とにかく、問題は確かに、ソケットから取得した値に表示することを期待していなかった文字の存在を中心に展開します。
引数内の意図しないリテラルに注意してください
たとえば、引数内にスペースを入れて、文字列/リテラルにレンダリングできます。
float(' 0.33')
意図しないスペースが引数に入らないことを確認した後、私は次のようになりました:
float(0.33)
このように、それは魅力のように機能します。
テイクアウェイは次のとおりです:入力内の意図しないリテラル(たとえば、表示されていないスペース)に注意を払ってください
デジタルスケールからシリアル出力を読み取ると、同様の問題が発生しました。 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)
これらの投稿の回答は役に立ちました: