[英]ValueError: could not convert string to float: '“ ”'
我有一些值是 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
所以我想將字符串轉換為浮點數。 所以這是我的代碼:
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'
,而是'"1151226468812.22"'
。 它還包含語音標記 ( "
)。這意味着在將其轉換為浮點數之前,您需要刪除前導和尾隨語音標記。幸運的是,Python 有一個非常方便的字符串方法.strip()
可以為您執行此操作。
string.strip(s)
將返回一個刪除了前導和結尾's'
字符的字符串
例如:
myString = "#hello#".strip("#")
在這段代碼中, myString
就是'hello'
在這種情況下,您想要去除row[1]
的前導和尾隨"
字符。您可以很容易地做到這一點:
row[1].strip("\"")
csv 中的第二個字段用"
引用。在 csv 中,引用字段並不意味着這些是字符串,但該字段可以包含分隔符,如"123,45"
。
讀取此類數據的正確方法是告訴讀者某些字段可以引用:
datareader = csv.reader(datafile, delimiter=',', quotechar='"')
這將返回沒有引號的第二個字段並解決您的問題。
之后刪除引號不僅會增加額外的工作,而且如果字段包含分隔符,還會導致錯誤。 例如, "123,45"
會將"123
和45"
作為兩個不同的字段返回。
很明顯,雙引號導致了問題,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 的列表,其中第二項包含數字。 然后可以將其轉換為浮點數。
嘗試使用以下內容:
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('"')))
這將刪除雙引號,現在您可以將字符串轉換為浮點數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.