我有一些值是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
所以我想把string转换成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条答案
按热度按时间wtzytmuj1#
问题是你的字符串不仅仅是
'1151226468812.22'
,而是'"1151226468812.22"'
。它还包含语音标记("
)。这意味着在将其转换为浮点数之前,需要删除前导和尾随语音标记。幸运的是,Python有一个非常方便的字符串方法.strip()
可以为您完成此操作。string.strip(s)
将返回删除了's'
开头和结尾字符的字符串例如:
在这段代码中,
myString
就是'hello'
在本例中,您希望去掉
row[1]
的前导和尾随"
字符。你可以很容易地做到这一点:xiozqbni2#
csv中的第二个字段用
"
引用。在csv中,带引号的字段并不意味着它们是字符串,而是字段可以包含一个分隔符,如"123,45"
。阅读此类数据的正确方法是告诉读者一些字段可以引用:
这将返回不带引号的第二个字段,并解决您的问题。
之后删除引号不仅会增加额外的工作,而且如果字段包含分隔符,还会导致错误。例如,
"123,45"
将返回"123
和45"
作为两个不同的字段。q1qsirdb3#
很明显,双引号导致了这个问题,Python只能将数字字符串(和十进制符号)转换为浮点数。
删除双引号的一种方法是使用正则表达式。这允许您运行相同的代码,无论输入是否有双引号:
输出:
此正则表达式将匹配:
[\"]?
一个起始双引号,如果存在(?
注意)。[0-9\.]*
一系列任意长度的数字或点字符(*
负责后者)。[\"]?
结尾双引号(如果存在)。它返回一个长度为3的列表,其中的第二项包含数字。然后可以将其转换为浮点数。
njthzxwz4#
尝试使用以下内容:
或
这将删除双引号,现在您可以将字符串转换为浮点型。