一部の値は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の2番目のフィールドは"
で囲まれています。 csvでは、引用符で囲まれたフィールドがあることはそれらが文字列であることを意味しませんが、フィールドに"123,45"
のような区切り文字が含まれる可能性があることを意味します。
このようなデータを読み取る正しい方法は、引用符で囲まれている可能性があるフィールドをリーダーに伝えることです。
datareader = csv.reader(datafile, delimiter=',', quotechar='"')
これは、引用符なしで2番目のフィールドを返し、問題を解決します。
後で引用符を削除すると、余分な作業が追加されるだけでなく、フィールドに区切り文字が含まれている場合にエラーが発生する可能性もあります。たとえば、"123,45"
は、"123
と45"
を2つの異なるフィールドとして返します。
二重引用符が問題の原因であることは明らかです。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番目の項目には数値が含まれています。その後、これを浮動小数点数に変換できます。
以下を使用してみてください:
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('"')))
これにより二重引用符が削除され、文字列を浮動小数点数に変換できるようになります。