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.
Итак, в чем проблема?
Ответы
Ответ 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)
Как это работает как шарм.
Отнимите это: обратите внимание на непреднамеренные литералы (например, пробелы, которые вы не видели) в вашем вводе.