2012-03-06 7 views
1

データフィードからテキストとして取得しているデータがあります。例えば、私は、次のようなデータを受信:文字列データのjson.dumpsから二重引用符を削除します。

1105488000000, 34.1300, 34.5750, 32.0700, 32.2800\r\n 
1105574400000, 32.6750, 32.9500, 31.6500, 32.7300\r\n 
1105660800000, 36.8250, 37.2100, 34.8650, 34.9000\r\n 

(これは、最初の列は、タイムスタンプ、次列であるである在庫データ、オープン、高、低、および。期間の終値)

私は、次のようなJSONにこれを変換したい:

[ 
[1105488000000, 34.1300, 34.5750, 32.0700, 32.2800], 
[1105574400000, 32.6750, 32.9500, 31.6500, 32.7300], 
[1105660800000, 36.8250, 37.2100, 34.8650, 34.9000], 
... 

私が使用しているコードは次のとおりです。

lines = data.split("\r\n"); 
    output = [] 
    for line in lines: 
    currentLine = line.split(",") 
    currentLine = [currentLine[0] , currentLine[1] , currentLine[2], currentLine[3], currentLine[4]] 
    output.append(currentLine) 


    jsonOutput = json.dumps(output) 

しかし、私はこれを行う際に、I値であることを発見だ:

[ 
["1105488000000", "34.1300", "34.5750", "32.0700", "32.2800"], 
["1105574400000", "32.6750", "32.9500", "31.6500", "32.7300"], 
["1105660800000", "36.8250", "37.2100", "34.8650", "34.9000"], 

は、二重引用符なしで出力を得るために私のためにとにかくありますか?

+0

数値を挿入するのではなく、配列に文字列を挿入するからです。 –

答えて

3

出力する前にint()またはfloat()のコンストラクタでデータを渡しての番号に変換します。

+0

ありがとうございます。私はそれを試みたが、私の結果は、以下のような小数の問題があります。 [1105488000000、34.130000000000003、34.579999999999998、32.07、32.280000000000001] 私はラウンド使ってみましたが、それが動作するように表示されません。私はDecimalを検索しましたが、jsonはDecimalをシリアル化できないようです。 – steve8918

+0

はい、IEEE 754浮動小数点数は、正確な値がごくわずかです。 –

+0

他の選択肢はありますか?またはJSONライブラリが私には適していないので、自分でJSONをビルドする必要がありますか? – steve8918

2

変更

currentLine = [currentLine[0] , currentLine[1] , currentLine[2], currentLine[3], currentLine[4]] 
output.append(currentLine) 

currentData = map(lambda num: float(num.strip()) , currentLine) 
output.append(currentData) 

にあなたが

currentLine = line.split(",") 

currentLineを初期化するたびにcurrentLineのすべての要素は文字列です。したがって、これをJSONに書き込むたびにJSON文字列が取得されます。すべての文字列を数字に変換することで、引用符なしで何かが得られます。また、データの例に示すように、先頭と末尾の空白を処理するためにstrip()呼び出しを追加しました。

P.S.全く異なる2つの変数に同じ変数名を使用しないでください。文字列のリストにはcurrentLine、数字のリストにはcurrentDataを使用する方がより明確です。

+1

['map'](http://docs.python.org/tutorial/datastructures.html#functional-programming-tools)はここで非常に便利です。 – sarnold

+0

@sarnoldマップも私の最初の本能でしたが、出力データが一定のサイズでなければならないときはマップの使用には慎重ですが、入力データが大きくなることがあります。つまり、質問のデータサンプルは1行につき5つの数字になるので、マップを使用するように答えを変更しました。 –

+0

Heh、[kevの答え](http://stackoverflow.com/a/9577022/377270)はまだクリーナーです。私は主にリスト内包が導入される前にPythonを使用していたので、彼らはまだ私の心の後ろにいます。 – sarnold

3
... 
currentLine = [float(i) for i in currentLine] 
output.append(currentLine) 
... 
関連する問題