0

この文字列のリストをfloatのリストに変換するのに問題があります。私はこれを2つの方法で試しましたが、それぞれが異なるエラーを返しました。

import csv
import math

unemp_reader = csv.reader(open('unemp.csv', 'rU'))
unemp_lines = list(unemp_reader)

for rows in unemp_lines:     #tried this way, but error tells me indices must be integers 
    i = 1
    for i in rows:
        a = map(float, unemp_lines[i])
        float_list.append(a)
    print float_list

for row in unemp_lines:  #tried this way but the list returned is empty
    y = row[1].split(",")[1:-1]
    float_list = [float(i) for i in y if i]
print float_list
4

1 に答える 1

6

ここでの最初の例での問題は、forループがインデックスを提供せず、リストから値を提供することです。これは、あなたの例がまったく意味をなさないことを意味します。

2番目の例では、行の2番目の項目を取得し、それをコンマで分割し(いずれにしても、すべてcsvモジュールで処理する必要があります)、結果のリストの2番目から2番目の項目を取得します。私が想像するように、値にコンマがなかったので、これは[1:-1]1つの要素を持つリストを取り、空のリストを返します。ここでの意図がよくわかりません。また、最後の行のデータのみを保存します(float_list毎回上書きします)。あなたはモジュールを二番目に推測していcsvて、これを実際よりもずっと難しくしているようです。

あなたはそれを過度に複雑にするのをやめる必要があります:

with open('unemp.csv', 'rb') as data:
    rows = csv.reader(data)
    next(rows) #Skip the headers.
    floats = [[float(item) for number, item in enumerate(row) if item and (1 <= number <= 12)] for row in rows]

print(floats)

説明するために、最初にwithステートメントを使用して、読み取り可能でpythonicな方法でファイルを開きます(これにより、例外が発生した場合でも、ファイルが適切に閉じられます)。次にcsv.reader、CSVファイルからデータを取得するためにを作成します。イテレータを1つ進めることでヘッダーをスキップします。つまり、2行目から開始します。Year次に、リスト内包を使用して、イテレータから新しいリストを生成します。このリストには、値が存在し、またはAnnual列にない場合に値の浮動小数点数を生成する別のリスト内包が含まれます。これを行うには、組み込みを使用して現在の列の番号を取得し、それが()または( )enumerate()でないことを確認するためのチェックを実行します。0Year13Annual

JFSebastianがコメントで指摘しているように、最善の解決策は、値を指定して呼び出しにcsv名前付き引数を追加することにより、モジュールが数値の処理を処理できるようにすることです。例えば:quotingcsv.reader()csv.QUOTE_NONNUMERIC

with open('unemp.csv', 'rb') as data:
    rows = csv.reader(data, quoting=csv.QUOTE_NONNUMERIC)
    next(rows) #Skip the headers.
    floats = [[item for number, item in enumerate(row) if item and (1 <= number <= 12)] for row in rows]

print(floats)
于 2012-06-18T01:45:01.973 に答える