Подтвердить что ты не робот

Python ValueError: неверный литерал для float()

У меня есть script, который считывает данные о температуре:

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)

Иногда script терпит неудачу в строке, которая преобразует значения в float:

Файл "./projector.py", строка 129, в get_temp
данные [ch] = float (temp)
ValueError: неверный литерал для float(): + 135.057E + 0
+ 078.260E + 0
+00029

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

float(+135.057E+0)

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

Итак, в чем проблема?

4b9b3361

Ответ 1

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

print repr(temp)

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

- Отредактировано для изменения вопроса -

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

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

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

Ответ 2

У меня была аналогичная проблема с чтением последовательного выхода из цифровой шкалы. Я читал [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)

Ответы в этих сообщениях помогли:

Ответ 3

Остерегайтесь возможных непреднамеренных литералов в вашем аргументе

например, у вас может быть пробел в вашем аргументе, переводящий его в строку/литерал:

float(' 0.33')

Убедившись, что непреднамеренное пространство не входит в аргумент, я остался с:

float(0.33) 

Как это работает как шарм.

Отнимите это: обратите внимание на непреднамеренные литералы (например, пробелы, которые вы не видели) в вашем вводе.