

csvファイルの読み取りについてお尋ねしたいのですが

[code]

    import csv
        
    f = open("test2.csv", "r",)
    reader = csv.reader(f)
        
    for row in reader:
        print(row)
        
    f.close()　
    
[/code]

現在このような形でcsvファイルを読み込んでおり、読み込みには成功しています。

ここからE列にいくつ10以上数値があるかをカウントしたいと思っております  
そこで

[code]

    import csv
    f = open("test2.csv", "r", )
    reader = csv.reader(f)
    count = 0
    for row in reader:
        colE = int(row[5])
        if colE >= 10:
            count += 1
            print(count)
            
    f.close()
    
[/code]

としてみたところ、"list index out of range"
というエラーがでました。これはどういうことなのでしょうか、またどこか間違っている個所があれば教えていただきたいです。

以下のようなcsvファイルです

[code]

    ダウンロードした時刻：2019/10/16 12:01:46                  
                        
    寺泊  寺泊
    年   月   日   時   風速(m/s) 風向
                        
    2018    2   12  1   10.1    西北西
    2018    2   12  2   9.1 西
    2018    2   12  3   10  西
    2018    2   12  4   11.4    西
    2018    2   12  5   10.4    西
    2018    2   12  6   10.8    西
    2018    2   12  7   11.1    西
    2018    2   12  8   12.4    西
    2018    2   12  9   11.5    西北西
    2018    2   12  10  11.2    西
    2018    2   12  11  8.9 西北西
    2018    2   12  12  8.1 西北西
    2018    2   12  13  5.7 西北西
    2018    2   12  14  6.3 西北西
    2018    2   12  15  5.5 西北西
    2018    2   12  16  7.1 西北西
    2018    2   12  17  7   西北西
    2018    2   12  18  6.4 西北西
    2018    2   12  19  8   西北西
    2018    2   12  20  8.6 西北西
    2018    2   12  21  7.9 西北西
    2018    2   12  22  8.7 西北西
    2018    2   12  23  8.9 西
    2018    2   12  24  10.1    西
    2018    2   13  1   5.2 北西
    2018    2   13  2   7   西北西
    2018    2   13  3   6.4 西北西
    2018    2   13  4   5.4 北西
    2018    2   13  5   5.4 北西
    2018    2   13  6   3.9 北西
    2018    2   13  7   3.5 北西
    2018    2   13  8   1.2 北
    2018    2   13  9   3   北西
    2018    2   13  10  3.4 北西
    2018    2   13  11  3.1 北西
    2018    2   13  12  4   北西
    2018    2   13  13  1.9 北西
    2018    2   13  14  2.2 北西
    2018    2   13  15  2.1 北西
    2018    2   13  16  2.7 北西
    2018    2   13  17  2.3 西北西
    2018    2   13  18  0.5 西
    2018    2   13  19  4.9 西北西
    2018    2   13  20  9.9 西
    2018    2   13  21  11.1    西
    2018    2   13  22  8.3 西北西
    2018    2   13  23  10.1    西
    2018    2   13  24  7.7 西
    
[/code]


CC BY-SA 4.0
2019-11-11T02:03:12.713
60396
2021-12-23T05:03:35.337
2021-02-14T06:15:54.007
3060
36312
question
python
PythonでCSVファイルの列データ読み込み時にエラー: list index out of range


> list index out of range というエラー

これは、IndexErrorを指していますね？（エラーは正確に貼り付けた方が回答が得られやすくなります）

IndexErrorはシーケンスアクセス時に範囲外の要素を参照した場合に送出されます。

[組み込み例外 — Python 3.8.0
ドキュメント](https://docs.python.org/ja/3/library/exceptions.html#IndexError)

記載されたコードにおいて、シーケンスへのアクセスは6行目の `colE = int(row[5])` のみなので、ここでのアクセス時に問題があるようです。

さて、このコードを修正する方法ですが、

  * そもそもE列に対応する添字は4なので、それを修正する（5だと西北西などがヒットするはずです）
  * `print(len(row))` などしてみて、おかしい値が読み込まれていないか調べる
  * `if len(row) != 5: sys.exit()` のように、長さがおかしい列を見つけたら終了するように作り変える

などが考えられます。


CC BY-SA 4.0
2019-11-11T02:45:19.883
60399
2019-11-11T02:45:19.883
29826
60396
answer


参考までに、[pandas.read_csv()](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.read_csv.html)で処理する方法を挙げておきます。

`read_csv()` には `skiprows` というパラメータがあって、読み込みをスキップする行数を指定することができます。上記の CSV
データの場合、先頭の3行は不要で、4行目をヘッダとして読み込む事になりますので、`skiprows=3` を指定します。なお、`read_csv()`
ではデフォルトで空行を無視します(`skip_blank_lines=True`)。

[code]

    import pandas as pd
    
    df = pd.read_csv('test2.csv', skiprows=3)
    count = df[df['風速(m/s)'] >= 10.0].shape[0]
    
    print(count)
    
[/code]

**追記**

> 途中でE列に値の無いセルがあると、エラーがでてしまい止まってしまいます。

例えば、以下の様な行がある、という事かと思います。

[code]

    2018,2,12,6,,西
    
[/code]

この場合、for loop 内で E 列(風速)に値があるかどうかを調べて、値が無ければデータの次の行を調べる様にします。

[code]

    import csv
    
    f = open("test2.csv", "r")
    reader = csv.reader(f)
    [next(reader) for _ in range(5)]
    
    count = 0
    for row in reader:
      if not row[4].strip(): # confirm if column E has no value
        continue
      colE = float(row[4])
      if colE >= 10:
        count += 1
    
    print(count)
    f.close()
    
[/code]

ちなみに、pandas のデータフレームの場合では空欄は `NaN` として扱われる事になります。


CC BY-SA 4.0
2019-11-11T06:56:33.980
60408
2019-11-13T02:09:03.403
2019-11-13T02:09:03.403
60396
answer