web-dev-qa-db-ja.com

ValueError:文字列を浮動小数点に変換できませんでした: '""'

一部の値は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"'
3
vipul gangwar

問題は、文字列が_'1151226468812.22'_だけではなく、_'"1151226468812.22"'_であることです。また、スピーチマーク(_"_)も含まれています。つまり、これをフロートに変換する前に、先頭と末尾のスピーチマークを削除する必要があります。幸い、Pythonには、これを行うための非常に便利な文字列メソッド.strip()があります。

string.strip(s)は、先頭と末尾の_'s'_文字を削除した文字列を返します

例えば:

_myString = "#hello#".strip("#")
_

このコードでは、myStringは単に_'hello'_になります

この場合、先頭と末尾の_row[1]_文字の_"_を削除します。あなたはこれを非常に簡単に行うことができます:

_row[1].strip("\"")
_
3
scrbbL

Csvの2番目のフィールドは"で囲まれています。 csvでは、引用符で囲まれたフィールドがあることはそれらが文字列であることを意味しませんが、フィールドに"123,45"のような区切り文字が含まれる可能性があることを意味します。

このようなデータを読み取る正しい方法は、引用符で囲まれている可能性があるフィールドをリーダーに伝えることです。

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

これは、引用符なしで2番目のフィールドを返し、問題を解決します。

後で引用符を削除すると、余分な作業が追加されるだけでなく、フィールドに区切り文字が含まれている場合にエラーが発生する可能性もあります。たとえば、"123,45"は、"12345"を2つの異なるフィールドとして返します。

0
Danny_ds

二重引用符が問題の原因であることは明らかです。Pythonは、数値の文字列(および小数点記号)のみを浮動小数点数に変換できます。

二重引用符を削除する1つの方法は、正規表現を使用することです。これにより、入力に二重引用符があるかどうかに関係なく、同じコードを実行できます。

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
Tom de Geus

以下を使用してみてください:

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

これにより二重引用符が削除され、文字列を浮動小数点数に変換できるようになります。

0
1313e