2014-02-21 1 views
16

У меня есть скрипт, который считывает данные температуры:питон ValueError: неверный буквальное для поплавка()

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) 

Иногда сценарий терпит неудачу на линии, которая преобразует значения плавать:

File "./projector.py", line 129, in get_temp
data[ch] = float(temp)
ValueError: invalid literal for float(): +135.057E+0
+078.260E+0
+00029

, но это НЕ является недействительным литералом. Если я введу это в любую оболочку python,

float(+135.057E+0) 

затем он корректно возвращает 135.057.

В чем проблема?

+0

литералов являются строки, так что вы на самом деле делаете 'поплавок ('+ 135.057E + 0') ', а не' float (+ 135.057E + 0) ', что, конечно, работает, так как оно уже является float. но это преобразование из строки тоже работает. –

+7

Возможно ли, что в нем есть какой-то невидимый паразитный персонаж? – BrenBarn

+6

Вы можете использовать 'print (repr (temp))' для проверки непечатаемых символов. –

ответ

11

Я бы сказал, что проблема - это какой-то непечатаемый символ, который присутствует в ценности, которую вы сняли со своего сокета. Похоже, что вы используете Python 2.x, в этом случае вы можете проверить их с этим:

print repr(temp) 

Вы, вероятно, увидеть что-то там, что сбежал в форме \x00. Эти непечатаемые символы не отображаются при печати непосредственно на консоль, но их присутствие достаточно, чтобы негативно повлиять на синтаксический анализ строкового значения в float.

- ред изменения вопроса -

Оказывается это частично точное для вашего вопроса - основная причина, однако, кажется, что вы читаете больше информации, чем вы ожидаете от розетки или иным образом получать множественные значения. Вы могли бы сделать что-то вроде

map(float, temp.strip().split('\r\n')) 

Для того, чтобы преобразовать каждое из значений, но если ваша функция должна возвращать одно значение с плавающей точкой, это может вызвать путаницу. Во всяком случае, проблема, безусловно, связана с присутствием символов, которые вы не ожидали увидеть в ценности, которую вы получили из своего сокета.

0

У меня была аналогичная проблема, читая серийный выход из цифровой шкалы. Я читал [3:12] из строки вывода длиной 18 символов.

В моем случае иногда имеется нулевой символ «\ 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) 

Ответы на эти посты помогли:

  1. How to get rid of \x00 in my array of bytes?
  2. Invalid literal for float(): 0.000001, how to fix error?