Python:ValueError:无法将字符串转换为浮点数:'0'

Posted

技术标签:

【中文标题】Python:ValueError:无法将字符串转换为浮点数:\'0\'【英文标题】:Python: ValueError: could not convert string to float: '0'Python:ValueError:无法将字符串转换为浮点数:'0' 【发布时间】:2015-03-30 22:30:31 【问题描述】:

对于一些学校作业,我一直在尝试让 pyplot 根据来自 Logger Pro 的数据为我绘制一些科学图表。我遇到了错误

ValueError: could not convert string to float: '0'

这是程序:

plot.py
-------------------------------
import matplotlib.pyplot as plt 
import numpy as np

infile = open('text', 'r')

xs = []
ys = []

for line in infile:
    print (type(line))
    x, y = line.split()
    # print (x, y)
    # print (type(line), type(x), type(y))

    xs.append(float(x))
    ys.append(float(y))

xs.sort()
ys.sort()

plt.plot(xs, ys, 'bo')
plt.grid(True)

# print (xs, ys)

plt.show()

infile.close()

输入文件包含以下内容:

text
-------------------------------
0 1.33
1 1.37
2 1.43
3 1.51
4 1.59
5 1.67
6 1.77
7 1.86
8 1.98
9 2.1

这是我在运行程序时收到的错误消息:

Traceback (most recent call last):
  File "\route\to\the\file\plot01.py", line 36, in <module>
    xs.append(float(x))
ValueError: could not convert string to float: '0'

【问题讨论】:

在编辑中,我似乎已经销毁了证据。 BOM 字节不再出现在帖子中,甚至在原始版本中也没有。谢谢,堆栈!...(咳咳)。 那很好,我想... 【参考方案1】:

您的数据文件中有一个 UTF-8 BOM;这就是我的 Python 2 交互式会话状态正在转换为浮点数:

>>> '0'
'\xef\xbb\xbf0'

\xef\xbb\xbf 字节是 UTF-8 编码的 U+FEFF ZERO WIDTH NO-BREAK SPACE,通常用作字节顺序标记,尤其是 Microsoft 产品。 UTF-8 没有字节顺序问题,不需要像 UTF-16 或 UTF-32 那样记录字节顺序;相反,Microsoft 将其用作检测编码的辅助手段。

在 Python 3 上,您可以使用 utf-8-sig 编解码器打开文件;此编解码器在开始时需要 BOM 并将其删除:

infile = open('text', 'r', encoding='utf-8-sig')

在 Python 2 上,您可以使用codecs.BOM_UTF8 constant 进行检测和剥离;

for line in infile:
    if line.startswith(codecs.BOM_UTF8):
        line = line[len(codecs.BOM_UTF8):]
    x, y = line.split()

作为codecs documentation explains it:

由于 UTF-8 是 8 位编码,因此不需要 BOM,解码字符串中的任何 U+FEFF 字符(即使它是第一个字符)都被视为 ZERO WIDTH NO-BREAK SPACE

如果没有外部信息,就不可能可靠地确定用于对字符串进行编码的编码。每个charmap编码都可以解码任何随机字节序列。然而,这在 UTF-8 中是不可能的,因为 UTF-8 字节序列的结构不允许任意字节序列。为了提高检测 UTF-8 编码的可靠性,Microsoft 为其记事本程序发明了 UTF-8 的变体(Python 2.5 调用 "utf-8-sig"):在将任何 Unicode 字符写入文件之前,编写了 UTF-8 编码的 BOM(看起来像这样的字节序列:0xef0xbb0xbf)。因为任何charmap编码的文件都不太可能以这些字节值开头(例如映射到

LATIN SMALL LETTER I WITH DIAERESIS
RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
INVERTED QUESTION MARK

在 iso-8859-1) 中,这增加了可以从字节序列中正确猜出 utf-8-sig 编码的概率。所以这里的 BOM 不是用来确定用于生成字节序列的字节顺序,而是作为帮助猜测编码的签名。在编码utf-8-sig 编解码器时会将0xef0xbb0xbf 作为文件的前三个字节写入。在解码utf-8-sig 时,如果它们作为文件中的前三个字节出现,则它们将跳过这三个字节。在 UTF-8 中,不鼓励使用 BOM,通常应避免使用。

【讨论】:

@EmilLykkeDiget:你在使用 Python 3 吗? 我忘记写了;是的,我正在使用 Python 3。 简单但有效;那行得通!非常感谢!

以上是关于Python:ValueError:无法将字符串转换为浮点数:'0'的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:无法将字符串转换为浮点数:Python中的“lisans”

ValueError:无法将字符串转换为浮点数:在 python 上绘制图形

Python ValueError:无法将字符串转换为浮点数:

数字后带有减号的 CSV 文件。 “ValueError:无法将字符串转换为浮点数:”

ValueError:无法将字符串转换为浮点数:'GIAC'

ValueError:无法将字符串转换为浮点数:'Bad'