ここでの最初の例での問題は、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()
でないことを確認するためのチェックを実行します。0
Year
13
Annual
JFSebastianがコメントで指摘しているように、最善の解決策は、値を指定して呼び出しにcsv
名前付き引数を追加することにより、モジュールが数値の処理を処理できるようにすることです。例えば:quoting
csv.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)