错误值: 无法将字符串转换为浮点数: '" "'

6

我可以帮助您翻译。以下是需要翻译的内容:

我有一些值在csv文件中,其中一些值是数字,而另一些是字符串数字。

csv文件示例:

1,"1151226468812.22",100,1,467,999.00,999.95,15,1,999.00,999.95,998.50,999.95,15,999.01,1396,34,06092016091501.444,1394627.25
2,"1151226468812.11",100,1,467,999.00,1000.00,1605,3,999.00,1000.00,998.50,1000.00,5,999.03,1426,37,06092016091502.111,1424626.50

我想将字符串转换为浮点数。这是我的代码:

datareader = csv.reader(datafile, delimiter=",", quoting= csv.QUOTE_NONE)

    names =  []
    names.append("local_timestamp")
    names.append("nse_timestamp")
for row in datareader:
        data = dict()
        data.update(local_timestamp = row[0])
        data.update(nse_timestamp = float(row[1]))

但是它返回值错误。
ValueError: could not convert string to float: '"1151226468812.22"'

你正在尝试将一个字符串转换为浮点数。先尝试从“1151226468812.22”中去掉“ ”,然后再将其转换为浮点数。 - Sociopath
1
请注意错误消息中的双引号... - DavidG
去掉引号,然后尝试转换它。 - cs95
4个回答

9
问题在于你的字符串不只是'1151226468812.22',而是'"1151226468812.22"'。它还包含引号(")。这意味着在将其转换为浮点数之前,需要删除前导和尾随的引号。幸运的是,Python有一个非常方便的字符串方法.strip()可以帮助你完成这个任务。 string.strip(s)会返回一个移除了开头和结尾的字符's'的字符串。
例如:
myString = "#hello#".strip("#")

在这段代码中,myString 只是 'hello'

在这种情况下,您希望去掉 row[1] 前面和后面的引号字符 " 。您可以很容易地实现:

row[1].strip("\"")

1
你的csv文件中第二个字段是用"引起来的。在csv中,被引号包含的字段并不意味着它们是字符串,而是该字段可能包含分隔符,比如"123,45"
正确的读取方式是告诉读取器一些字段可以被引用。
datareader = csv.reader(datafile, delimiter=',', quotechar='"')

这将返回第二个字段,没有引号,解决您的问题。
之后删除引号不仅会增加额外的工作,而且如果字段包含分隔符,则可能会导致错误。例如,"123,45" 将返回两个不同的字段 "12345"

0

很明显,双引号是问题的原因,Python只能将数字字符串(和小数点符号)转换为浮点数。

消除双引号的一种方法是使用正则表达式。这样可以让您运行相同的代码,无论输入是否带有双引号:

import re

print(float(re.split(r'[\"]?([0-9\.]*)[\"]?','1151226468812.22')[1]))
print(float(re.split(r'[\"]?([0-9\.]*)[\"]?','"1151226468812.22"')[1]))

输出:

1151226468812.22
1151226468812.22

这个正则表达式将匹配:

  • [\"]? 如果存在,匹配起始双引号(? 可以处理)。
  • [0-9\.]* 匹配任意长度的数字或点字符序列(* 可以处理后者)。
  • [\"]? 如果存在,匹配结束双引号。

它返回一个长度为三的列表,其中第二项包含数字。然后可以将其转换为浮点数。


0

尝试使用以下内容:

for row in datareader:
    data = dict()
    data.update(local_timestamp = row[0])
    data.update(nse_timestamp = float(row[1].replace('"', '')))

或者

for row in datareader:
    data = dict()
    data.update(local_timestamp = row[0])
    data.update(nse_timestamp = float(row[1].strip('"')))

这将删除双引号,现在您可以将字符串转换为浮点数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接