2016-09-15 10 views
0

私はcsvファイルを読み込み、すべての行に文字列要素が含まれています。一つは、次のようになります。データセットのリストの一部の要素をfloatに変換する

"orange", "2", "65", "banana" 

私はなるために、私のデータセット内では、これを変更したい:ここ

row = ["orange", 2.0, 65.0, "banana"] 

は私のコードです:

data = f.read().split("\n") 
for row in data: 
    for x in row: 
     if x.isdigit(): 
      x = float(x) 
    print row 

しかし、それはまだ元の行を印刷しますlike:

"orange", "2", "65", "banana" 

私も交流したいリスト内包(今のところ)を使わずにこれを知る。

答えて

1

私はあなたがそのような場所で行配列を編集することはできないと考えています。 x変数は実際には配列内の要素を参照するのではなく、配列のコピーを参照するため、配列を繰り返し処理した後に行った変更はすべて蒸発します。

私は、これがこれを行うための慣用的な「Pythonの道」ですが、あなたは何ができるかはわからない:

data = f.read().split("\n") 
for row in data: 
    parsed_row = [] 
    for x in row: 
     if x.isdigit(): 
      x = float(x) 
     parsed_row.append(x) 
    print parsed_row 

またより「神託」の方法、コメントでJGreenwellによって提供されるように、かもしれません要素が浮動小数点に解析できない場合に例外がスローされるようにすること。

data = f.read().split("\n") 
for row in data: 
    parsed_row = [] 
    for x in row: 
     try: 
      parsed_row.append(float(x)) 
     except ValueError: 
      parsed_row.append(x) 
    print parsed_row 

本当に私が想像する個人的な好みになるでしょう。 Pythonの例外は遅くすべきではないので、私はそれを心配しません。

+0

これは、OPが持つ問題です。よりPythonの方法は、 "許可よりも寛容を求めるのが良い"かもしれません。意味は、try/exceptブロックを使います: 'try:parsed_row.append(float(x))ValueError:parsed_row.append(x)'を除いて - このメソッドは[ここに示されています](http://stackoverflow.com/a/20929983)/4667934)、他の回答は、要件に応じてこれを行うさまざまな方法を示しています – JGreenwell

0

おそらく区切り記号です。

with open('yourfile.csv', 'rb') as csvfile: 
    reader = csv.reader(csvfile, delimiter=',', quotechar='|') 
    for row in reader: 
     for x in row: 
      if x.isdigit(): 
       print(float(x)) 
関連する問題