簡體   English   中英

ValueError: 無法將字符串轉換為浮點數:'“ ”'

[英]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"會將"12345"作為兩個不同的字段返回。

很明顯,雙引號導致了問題,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM