2017-10-27 3 views
1

私は解析しようとしているCSVファイルを持っています。プログラムを実行するとlist index out of rangeエラーが発生します。ここでなぜこのcsvファイルに引用符を追加する必要がありますか?

は、元のCSVファイルです:ここ

のtest.CSV

Date, Time To Process 
10/26/2017 7:57:28 PM, 5 
10/26/2017 7:57:46 PM, 3 
10/26/2017 7:57:47 PM, 1 
10/26/2017 7:57:49 PM, 1 
10/26/2017 7:57:50 PM, 6 
10/26/2017 7:57:52 PM, 5 

とは、私のコードです:

import csv 

with open('test.csv', 'rb') as n: 
    has_header = csv.Sniffer().has_header(n.read(1024)) 
    n.seek(0) 
    reader = csv.reader(n) 
    if has_header: 
     next(reader) 
    dates = [] 
    timeToProcess = [] 
    for row in reader: 
     print row 
     values = row[0].split(',') 
     dates.append(values[0]) 
     timeToProcess(values[1]) 

これは単に、CSVファイルの最初の行を出力しますエラーを出力します。timeToProcess.append(values[1]) IndexError: list index out of range

csvファイルを変更して各行の周りに引用符を付けると、すべて正常に動作します。それはなぜですか、そしてこのプログラムがcsvファイルに引用符を付けずに動く方法がありますか?

のtest.CSV(引用符で、作品1)

Date, Time To Process 
"10/26/2017 7:57:28 PM, 5" 
"10/26/2017 7:57:46 PM, 3" 
"10/26/2017 7:57:47 PM, 1" 
"10/26/2017 7:57:49 PM, 1" 
"10/26/2017 7:57:50 PM, 6" 
"10/26/2017 7:57:52 PM, 5" 
+1

pandas.read_csvについて聞いたことがありますか? – s5s

+0

私はそれを一度も使用したことはありませんでしたが、その方向で私を指摘してくれてありがとう。それは将来的には役に立つと思います。 – trueCamelType

答えて

4

は手動で行を分割csv.readerを使用しています。それは必要ではありません - csvモジュールの仕事はあなたのための "セル"を分離することです(カンマや改行のようなメタキャラクタが含まれていても)。インデントレベルごとに4つのスペース - ちょうど

with open('test.csv', 'rb') as n: 
    # ... 
    for row in reader: 
     dates.append(row[0]) 
     timeToProcess(row[1]) # maybe better int(row[1])? 

を行う。また、PEP-8 (Style Guide for Python code)を守ってください。

+1

ありがとう、それはまさにそうだった。スタイルガイドへのリンクありがとう。私はそれを維持しようとします。 – trueCamelType

2

私は、各行の前後に引用符を持っているCSVファイルを変更した場合

予想通り、すべてはそれはあなたが正しく列を抽出してはならない場合は動作します。行全体を引用符で囲むと、1つの列しか表示されません。

values = row[0].split(',') # You are reading the first column, then splitting columns 
dates.append(values[0]) # First part of the first column 
timeToProcess(values[1]) # Second part of the first column 

あなたが正しくそれをしたい場合、あなたはヘッダーが列の値を抽出することができるようにしたい場合はDictReaderまたはpandasライブラリを使用し

for row in reader: 
    print row 
    dates.append(row[0]) 
    timeToProcess(row[1]) 

を試すことができます。

あなたの質問に言い換えるとなぜcsvファイルに引用符を追加する必要がありますか?、列はコンマを持つことができるので、その列をエスケープする必要があります。

関連する問題