2016-10-27 23 views
1

csv.readerのラッパーを作成しています。不正な行(NULLバイトを持つ行)があっても読者が作業を続けることができます。 「ひどく行[actual_raw_line]を形成ガット」ログインして警告の一環として、生の問題の行が含まれている、私が本当にやりたいのですがどのようなcsv.readerでraw行を取得しますか?

def error_ignoring_csv_reader(csv_reader): 
    while True: 
     try: 
      yield next(csv_reader) 
     except csv.Error, e: 
      logger.warning("Got badly formed line with error [%s]" % e) 

が、CSVのソースコード上で読んで、私はそうではありません:それは次のようになりますそれにアクセスする方法を見つけました。 csv.readerの未加工の未処理の現在の行にアクセスできますか?

答えて

0

csv.readerで生の未処理の現在の行に直接アクセスする方法はわかりませんが、これらのオブジェクトは現在の行を取得するための基礎を提供できるcsvreader.line_num属性を使用できるようにします。

csv.readerのcsvfile引数は、iteratorプロトコルをサポートし、next()メソッドが呼び出されるたびに文字列を返すオブジェクトであるため、プレーンなファイルである必要はありません。リファレンスドキュメントには、オプションとしてストリングのリストが具体的に記述されています。

最初にファイルをリストに読み込むことができれば、エラーの場合には、line_num属性を使用してリストにインデックスを付けることができます。あるいは、問題のある行を見つけるためにファイルから行を読み返して再読み込みすることもできます。

また、ファイルから読み込んだ最後の行を覚えているカスタムイテレータを作成することもできます。 (この最後のアプローチでは、あなたのコードは特別なイテレータを作成し、それをcsv.readerに渡します。その場合はline_num属性を使用する必要はありません)

関連する問題