2016-08-17 65 views
0

我喜歡用csv閱讀器讀取ASCII文件列表(utf-8)。 對於錯誤處理,我喜歡檢測用戶是否因意外選擇了無法讀取的文件。 來源是這樣的:用csv閱讀器檢測錯誤的文件格式

for File in Filenames: 
    print ('... processing file :',File) 
    with open(File, 'r') as csvfile: 
     Reader = csv.reader(csvfile, delimiter = ';')   
     for Line in Reader: 
      print(Line) 

我用戶選擇例如其GZIPed我得到了消息文件:

(結果,消耗)= self._buffer_decode(數據,self.errors,最終) UnicodeDecodeError錯誤: 'UTF-8' 編解碼器不能在位置1解碼字節0x8b:無效的起始字節

哪一個可以,但腳本崩潰。 我沒有找到如何捕捉錯誤並強制腳本跳轉到列表中的下一個文件。我發現了很多關於方言和其他編解碼器的內容,但我的任務是不通過更改編解碼器來閱讀錯誤的文件。

非常感謝您的任何評論!

回答

1

如何:

for File in Filenames: 
    print ('... processing file :',File) 
    with open(File, 'r') as csvfile: 
     try: 
      Reader = csv.reader(csvfile, delimiter = ';')   
      for Line in Reader: 
       print(Line) 
     except UnicodeDecodeError as e: 
      print("File {:} cannot be read. Skipping...".format(csvfile)) 
      continue 
0

使用異常處理 - https://docs.python.org/3/tutorial/errors.html

那麼你的代碼是這樣:

for File in Filenames: 
    print ('... processing file :',File) 
    try: 
     with open(File, 'r', encoding='utf-8') as csvfile: 
      Reader = csv.reader(csvfile, delimiter = ';')   
      for Line in Reader: 
       print(Line) 
    except UnicodeDecodeError: 
     pass 

這是很好的做法,包括當你打開你所期望的編碼文件。如果您將相同的腳本放在Windows機器上,則默認編碼不會是「utf-8」。

+0

你真的不得不在'try'中包裝'with'嗎?它可以通過一個錯誤嗎? –

+0

IIRC,它是引發UnicodeDecodeError的open()的TextWrapper。 –

+0

非常感謝! –