2016-04-27 9 views
1

Python newbie here。リストのリストにCSVをインポートするPython

私はリストには、この

[ 
[[9143.680696, 427953.500000, 11919.104475, 11908.727555, 1.000871, 0.029506, 15.546608, 93, 121, 123], [7]], 
[[7704.773182, 330297.500000, 19186.759308, 19170.146116, 1.000867, 0.029426, 14.302257, 93, 121, 123], [7]] 
] 

のようにすべての行の最後の番号を行くようなファイルを読み込むために必要なフォーマット

9143.680696, 427953.500000, 11919.104475, 11908.727555, 1.000871, 0.029506, 15.546608, 93, 121, 123, 7 
7704.773182, 330297.500000, 19186.759308, 19170.146116, 1.000867, 0.029426, 14.302257, 93, 121, 123, 7 

この種の中の数字を含むCSVファイルを持っていますここでは7のように別のリストに格納されます。

私はここでいくつかの答えを調べましたが、私が扱っている問題に適合しないリストに文字列として格納されていることがわかりました。

ご協力いただきありがとうございます。


+0

あなたは、各行の最後の4つの項目は、int型または浮動小数点数(93または93.0として扱われることを期待しています)? – RafG

答えて

0

、 ipythonからinput.csv

import csv 
new_list = [] 
with open('input.csv') as inp: 
    csv_reader = csv.reader(inp, delimiter=',') 
    for line in csv_reader: 
     new_list.append([map(float, line[:-1])] + [map(float, line[-1:])]) 

デモとして、入力ファイル名を検討し、これを試すことができます外部モジュールを使用して:

更新:を私はフロートを生産しようとする新しいconvert(...)方法で簡単なfloat(...)変換を交換し、元の文字列を返します(または代わりに何かを行うことができます)の代わりにトークン場合に例外をスローします数字ではありません。質問からあなたの例のデータの

def convert(value_str): 
    try: # try to convert it to a float: 
     return float(value_str) 
    except ValueError: # if it is not a valid float literal, return the original string: 
     return value_str 

with open("file.csv") as csvfile: 
    split_lines = [line.split(",") for line in csvfile] 
    data = [[[convert(n) for n in line[:-1]], [convert(line[-1])]] for line in split_lines] 

    print(data) 

出力(手動でフォーマット済み):

[ 
    [ [9143.680696, 427953.5, 11919.104475, 11908.727555, 1.000871, 0.029506, 15.546608, 93.0, 121.0, 123.0], [7.0] ], 
    [ [7704.773182, 330297.5, 19186.759308, 19170.146116, 1.000867, 0.029426, 14.302257, 93.0, 121.0, 123.0], [7.0] ] 
] 
+0

リストに-nanという値が入っていればエラーになるでしょうか? – ethanruan

+0

はい、有効な浮動小数点リテラルのみがコンマで区切られていることを前提としています。たとえば、次のようなチェックを追加できます。変換に失敗した場合は代わりに文字列として値を返します。それを私の答えに追加する... –

+0

@ethanruanトークンが有効な浮動小数点数でない場合を処理するconvert()関数を追加しました。 –

3

あなたはfloat項目にしたい場合は、あなたがmapを使用することができます

>>> csv = '''9143.680696, 427953.500000, 11919.104475, 11908.727555, 
1.000871, 0.029506, 15.546608, 93, 121, 123, 7 
7704.773182, 330297.500000, 19186.759308, 19170.146116, 1.000867, 0.029426, 14.302257, 93, 121, 123, 7''' 
>>> [[line.split(',')[0:-1], [line.split(',')[-1]]] for line in csv.splitlines()] 
[[['9143.680696', ' 427953.500000', ' 11919.104475', ' 11908.727555', ' 1.000871', ' 0.029506', ' 15.546608', ' 93', ' 121', ' 123'], [' 7']], [['7704.773182', ' 330297.500000', ' 19186.759308', ' 19170.146116', ' 1.000867', ' 0.029426', ' 14.302257', ' 93', ' 121', ' 123'], [' 7']]] 

、このように試すことができ、

>>> data = csv.splitlines() 
>>> data = [map(float, line.split(',')) for line in csv.splitlines()] 
>>> [[items[:-1], items[-1]] for items in data] 
[[[9143.680696, 427953.5, 11919.104475, 11908.727555, 1.000871, 0.029506, 15.546608, 93.0, 121.0, 123.0], 7.0], [[7704.773182, 330297.5, 19186.759308, 19170.146116, 1.000867, 0.029426, 14.302257, 93.0, 121.0, 123.0], 7.0]] 

プリティ・プリント:ちょうど

>>> import pprint 
>>> pprint.pprint([[items[:-1], items[-1]] for items in data]) 
[[[9143.680696, 
    427953.5, 
    11919.104475, 
    11908.727555, 
    1.000871, 
    0.029506, 
    15.546608, 
    93.0, 
    121.0, 
    123.0], 
    7.0], 
[[7704.773182, 
    330297.5, 
    19186.759308, 
    19170.146116, 
    1.000867, 
    0.029426, 
    14.302257, 
    93.0, 
    121.0, 
    123.0], 
    7.0]] 
+0

ethanruanは10進数を格納して変換を追加したいと思いますか? – Whysmerhill

+0

Python 3では 'list(map(...))'やリストの理解が必要です。 – RafG

+0

@Whysmerhill私は解決策を追加しました。ありがとう –

0

を使用オペレータリストの左と右の部分を取得する:

import csv 
... 
list = [] 
with open(filename, "rb") as fd: 
    reader = csv.reader(fd, delimiter = ",") 
    for row in reader: 
     left = list(map(lambda x: float(x), row[:-1])) 
     right = list(map(lambda x: float(x), row[-1:])) 
     list.append([ left, right ]) 
1

CSV libraries、通常の文字列としてフィールドを読んで、あなたは明示的にフィールドを変換する必要があります。 csvモジュールのドキュメントから:

csvファイルから読み取られた各行は、文字列のリストとして返されます。いいえ 自動データ型変換が実行されます。

>>> import csv 
>>> with open('eggs.csv', 'rb') as csvfile: 
...  spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') 
...  for row in spamreader: 
...   <process row> 

同様に、CSVライブラリが均等にすべてのフィールドを扱いますので、あなたは明示的にリスト内の最後のフィールドをラップする必要があります。例えば

a = ["1.23", "2.34", "10", "100", "1000"] 

>>> map(float, a[0:2]) + map(int, a[2:4]) + [[int(a[4])]] 

[1.23, 2.34, 10, 100, [1000]] 
0

あなたは、リストを反復処理し、整数に変換する必要があります。また、あなたが望むリスト形式でそれらを保存します。

例:

import csv 
l = list() 
with open('data.csv', 'r') as csvfile: 
    reader = csv.reader(csvfile, delimiter=',') 
    for row in reader: 
    l.append([[float(row[:-1])]+[float(row[-1])]]) 
print(l) 
0

あなたは はせずに、最も単純なアプローチ

In [1]: import csv 

In [2]: new_list = [] 

In [3]: with open('input.csv') as inp: 
    ...:  csv_reader = csv.reader(inp, delimiter=',') 
    ...:  for line in csv_reader: 
    ...:   new_list.append([line[:-1]] + [line[-1:]]) 
    ...:   

In [4]: new_list 
Out[4]: 


    [[[9143.680696, 
    427953.5, 
    11919.104475, 
    11908.727555, 
    1.000871, 
    0.029506, 
    15.546608, 
    93.0, 
    121.0, 
    123.0], 
    [7.0]], 
[[7704.773182, 
    330297.5, 
    19186.759308, 
    19170.146116, 
    1.000867, 
    0.029426, 
    14.302257, 
    93.0, 
    121.0, 
    123.0], 
    [7.0]]] 
関連する問題