2011-11-02 8 views
5
全員に

で:とValueError:フロートのための無効なリテラル()はPython

誰かが私がエラーを理解するのに役立つことができれば、私は好奇心がありますとValueError:フロートのための無効なリテラル()。テキストファイルをリストに渡してから、このリストを浮動小数点値に変換しようとしているときに、これを取得しています。

print repr(lines[0]) 

を私が手::

「0.000 \ t0.000 ... \ t0.000 \ T0を、少なくとも私には、奇妙である何

a = open("input.txt","r") 
lines = a.readlines() 
b = map(float, lines) 

私が処理するときということです.000 \ n」は

print type(lines[0]) 

私が手:

<type 'str'> 

マップ(フロート、ライン)が正しく動作しない理由はわかりません。私はこの機能を間違って使用していますか?ドキュメントを見ると、map関数はmap(function、iterable、...)として与えられます。リストは反復可能ではありませんか?

また、誰かがこのエラーを説明できる場合は、このエラーの説明の方向に私を指摘していただければ幸いです。

この質問のお手伝いをしていただきありがとうございます。

+1

をあなたは '0.000 \ t0.000ことを言っている... \ t0の.000 \ n'はすべて1行ですか?もしそうなら、私はそれが 'float()'に渡されていると仮定し、変換することはできません。個々のフロート値に分割する必要があるようです。それは事実ですか? – eldarerathis

+0

@eldarerathisはい、それはすべて1行ですが、処理すると特定の数の値を通過するように見えるので、エラーが発生します: ValueError:float()のリテラルが無効です:0.000 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t。000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0.000 \t 0ですが、実際にはありませんそれは値を通って作るのですか? – geop

+0

これは上記の文字列のように見えますが、 '\ t 'は空白(つまり実際のタブ文字)として表示されます。それはすべての文字列リテラルであり、短いものではありません。私は推測しています。 – eldarerathis

答えて

7

この場合、リードラインは必要ありません。時間とメモリが浪費されます。

あなたはfloatのリストのリストする場合:

b = [[float(v) for v in line.rstrip('\n').split('\t')] for line in a] 

や山車のただ一つの大きなリスト:

b = [float(v) for line in a for v in line.rstrip('\n').split('\t')] 
2

a.readlines()は文字列のリストなので、表示されているエラーについてはfloat('0.000\t0.000\t0.000\t0.000\n')をマップに変換しようとしています。

あなたは(インラインコメントを参照してください)もう少し処理を実行する必要があります。

>>> x = '0.000\t0.000\t0.000\t0.000\n' 
# To simulate a.readlines()' list 
>>> lines = [x,] 
>>> 

# Strip the newline, and separate the values based on the tab control character. 
>>> lines_values = map(lambda l: l.strip().split('\t'), lines) 
>>> lines_values 
[['0.000', '0.000', '0.000', '0.000']] 

# For each value in in the list of lines' values, convert from string to a float. 
>>> values_float = [map(float, v) for v in values] 
>>> values_float 
[[0.0, 0.0, 0.0, 0.0]] 
+0

ありがとうございました。これは私が間違っていることを非常にはっきりさせます。私は本当にコメントを感謝します! – geop

2

ValueErrorは、文字列の\tの文字から来ています。それぞれの行を個別の列に分割してから、それぞれを個別に変換する必要があります。

>>> lines = ['0.000\t1.000\t2.000\n', '3.000\t4\t5.0\n'] 
>>> [[float(val) for val in line.strip().split('\t')] for line in lines] 
[[0.0, 1.0, 2.0], [3.0, 4.0, 5.0]] 
+0

助けてくれてありがとう、これは私のエラーを理解するのに役立ちます。私が理解していないことは、エラーが発見される前に、日付のいくつかがプロセスを通過したように見えたかどうかです。これは私のところでは誤解ですか? – geop

+0

上記のとおり.... – geop

関連する問題