2016-07-20 9 views
0

私はcsv.readerをpythonで使用して、csvファイルを辞書に読み込みます。 CSVファイルの最初の列は、DateTimeオブジェクトとして読み出され、dictの鍵となる(2つの可能なフォーマットのいずれかで)日付であり、そしてIはまた、列3及び4を読み取る:csv.readerが最初の行を逃す

import datetime as dt 
import csv 
with open(fileInput,'r') as inFile: 
    csv_in = csv.reader(inFile) 
    try: 
     dictData = {(dt.datetime.strptime(rows[0], '%d/%m/%Y %H:%M')): [rows[3], rows[4]] 
         for rows in csv_in} 
    except: 
     dictData = {(dt.datetime.strptime(rows[0], '%Y-%m-%d %H:%M:%S')): [rows[3], rows[4]] 
         for rows in csv_in} 

それファイル内の最初の日付(1/7/2012 00:00)が辞書に表示されない点を除き、動作します。 csv.readerに最初の行がヘッダー行でないことを伝える必要がありますか?

+0

あなたが書いたコードはそのフォーマット(2012年1月7日00:00)で動作し、最初の行を読みます。私は簡単なテストを行い、すべての行を読みました。しかし、 'try'と' except'を逆にすると、最初の行が見逃されるので、あなたのアプローチは健全ではありません。もし私があなただったら、私は日付形式を検出して、ファイルの先頭を探します(ドキュメントのSnifferの例のように)。それはまたあなたの試し/例外を避けるでしょう、あなたは事前にその形式を知っているだろうから。フォーマットのエラーをキャッチするだけでも '試してみることができます。 –

+0

ありがとうございます。実際には、入力のほとんどはYYYY-MM-DD hh:mm:ssの形式になっていますので、この形式にすべて変換してただ1つの形式を読み込みます。しかし、なぜ試してみましょう:...を除いて:行を欠場する? – doctorer

答えて

1

あなたtryexceptステートメントを実行すると、それはpythonの意志最初try何かを信じることは容易であり、それが失敗した場合、バックtry文が実行された前の状態に環境を戻します。それはこれをしません。したがって、失敗したtry試行で発生する可能性のある意図しない副作用に気づく必要があります。

あなたのケースでは、辞書の理解は、csv.reader()オブジェクト()のnext(...)を呼び出し、csvファイルの最初の行を返します。これで、イテレータcsv.reader()の最初の項目が使い果たされました。 tryブロックが失敗した場合、Pythonは以前の状態に戻りません。

例外が発生し、日付が間違った形式であると推定されています。 exceptブロックが引き継ぎ、csv_inオブジェクトのnext(...)を呼び出すと、イテレータの2番目のアイテムが取得されます。最初のものはすでに使用されています。

これを回避する簡単な変更は、csvイテレータオブジェクトのコピーを作成することです。

import datetime as dt 
import csv 
from copy import copy 
with open(fileInput,'r') as inFile: 
    csv_in = csv.reader(inFile) 
    try: 
     dictData = {(dt.datetime.strptime(rows[0],'%d/%m/%Y %H:%M')): 
         [rows[3],rows[4]] for rows in copy(csv_in)} 
    except ValueError: 
     dictData = {(dt.datetime.strptime(rows[0],'%Y-%m-%d %H:%M:%S')): 
         [rows[3],rows[4]] for rows in copy(csv_in)} 

最後に、一般的なExceptionをキャッチすることをおすすめします。私はあなたがValueErrorをキャッチしたいと思うと思います。

+0

ありがとうございます...私はPythonを初めて使い、「試し」と「例外」の誤解を正確に受けました。今よりはるかに明確に – doctorer

+1

心配する必要はありません、これは皆が学ぶ方法です。 :) –

関連する問題