ValueError:无法将字符串转换为float:'" "'

时间:2018-01-03 10:48:22

标签: python string csv floating-point integer

我有一些值是csv文件,而在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

所以我想把字符串转换为float。所以这是我的代码:

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"'

4 个答案:

答案 0 :(得分:3)

问题是您的字符串不只是'1151226468812.22',而是'"1151226468812.22"'。它还包含语音标记(")。这意味着在将其转换为浮点数之前,您需要删除前导和尾随语音标记。幸运的是,Python有一个非常方便的字符串方法.strip()来为你做这件事。

string.strip(s)将返回一个字符串,其中包含已删除的前导's'字符

例如:

myString = "#hello#".strip("#")

在此代码中,myString只是'hello'

在这种情况下,您要删除前导row[1]字符的"。你可以很容易地做到这一点:

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

答案 1 :(得分: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\.]*一系列数字或点数字的仲裁长度(*照顾后者)。
  • [\"]?结束双引号,如果存在。

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

答案 2 :(得分: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('"')))

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

答案 3 :(得分:0)

csv中的第二个字段引用"。在csv中,引用字段并不意味着它们是字符串,但字段可以包含分隔符,如"123,45"

阅读此类数据的正确方法是告诉读者可以引用一些字段:

datareader = csv.reader(datafile, delimiter=',', quotechar='"')

这将返回没有引号的第二个字段并解决您的问题。

之后删除引号不仅会增加额外的工作量,而且如果字段包含分隔符,也会导致错误。例如,"123,45"会将"12345"作为两个不同的字段返回。