2017-01-18 121 views
0

我有一個CSV(TSV)與此頭的Python 3:CSV文件和Unicode錯誤

"Message Name" "Field" "Base Label" "Base Label Update Date" "Translated Label" "Translated Label Update Date" "Language" 
"Message" "subject_template" "New Task: Assess Distribution Outcomes for ""${docNameNoLink}"", ""${docNumber}""" "8/10/16 4:17:43 PM" "Nouvelle tâche : évaluez le résultat de la distribution de « ${docNameNoLink} »." "2/17/14 5:09:10 AM" "fr" 

文件時,我嘗試使用此代碼

import csv 
with open(fileName, 'r', encoding='utf-8', errors='replace') as fdata: 
    csv.register_dialect('tsv', delimiter='\t', quoting=csv.QUOTE_NONE) 
    reader=csv.reader(fdata, dialect='tsv') 
    try: 
     for row in reader: 
      print (row) 
    except csv.Error as e: 
     sys.exit('file{}, line {}: {}'.format(fileName, reader.line_num, e)) 

我得到的消息讀取文件錯誤: 文件NameFile,第1行:行包含空字節

不過,如果我沒有錯誤的部分運行這段代碼=「代替|忽略」,同樣的代碼:

with open(fileName, 'r', encoding='utf-8') as fdata: 
    csv.register_dialect('tsv', delimiter='\t', quoting=csv.QUOTE_NONE) 
    reader=csv.reader(fdata, dialect='tsv') 
    try: 
     for row in reader: 
      print (row) 
    except csv.Error as e: 
     sys.exit('file {}, line {}: {}'.format(fileName, reader.line_num, e)) 

我得到了以下錯誤消息:

File "csvFiles.py", line 76 in <module> 
    for row in reader: 
    File "c:\Python35\lib\codecs.py", line 321 in decode (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte 

這是什麼錯誤的可能原因以及如何糾正它,讓這個腳本的工作?

回答

2

您的數據不是用'utf-8'編碼,而是用'utf-16-le'或類似的東西編碼。 'utf-16-le'只是一個猜測。當我用'utf-16-le'編碼你的數據時,就會產生相同的錯誤。檢查數據文件的編碼。在Linux中,您可以使用像emacs這樣的編輯器或「文件」實用程序。

錯誤消息本身告訴我們,文件的第一個字節是0xff。這可能是Byte-Order Mark的一部分。