2017-08-01 74 views
0

我是python和stackoverflow的新手。嘗試讀取python中的csv文件時的Unicode解碼錯誤

  • 我有一個文件夾與csv文件,我試圖從每個文件中讀取字段名稱,並將它們寫入新的csv文件。
  • 感謝stackoverflow,我能夠編寫和編輯我的代碼,直到unicode錯誤出來。
  • 我盡力解決這個錯誤並且做了研究。
  • 我發現在Mac或Linux中創建的文件有utf8 unicode,在windows中創建的文件有cp949。
  • 因此,我必須通過utf8打開它們。

我的代碼第一次看到這樣的:

import csv 
import glob 
lst=[] 
files=glob.glob('C:/dataset/*.csv') 
with open('test.csv','w',encoding='cp949',newline='') as testfile: 
    csv_writer=csv.writer(testfile) 
    for file in files: 
     with open(file,'r') as infile: 
      file=file[file.rfind('\\')+1:] 
      reader=csv.reader(infile) 
      headers=next(reader) 
      headers=[str for str in headers if str] 
      while len(headers) < 3 : 
       headers=next(reader) 
       headers=[str for str in headers if str] 
      lst=[file]+headers 
      csv_writer.writerow(lst) 

那麼這個錯誤就出來了:

Traceback (most recent call last): 
    File "C:\Python35\2.py", line 12, in <module> 
    headers=next(reader) 
UnicodeDecodeError: 'cp949' codec can't decode byte 0xec in position 6: illegal multibyte sequence 

這裏是我試圖修復unicode的錯誤:

import csv 
import glob 
lst=[] 
files=glob.glob('C:/dataset/*.csv') 
with open('test.csv','w',encoding='cp949',newline='') as testfile: 
    csv_writer=csv.writer(testfile) 
    for file in files: 
     try: 
      with open(file,'r') as infile: 
       file=file[file.rfind('\\')+1:] 
       reader=csv.reader(infile) 
       headers=next(reader) 
       headers=[str for str in headers if str] 
       while len(headers) < 3 : 
        headers=next(reader) 
        headers=[str for str in headers if str] 
       lst=[file]+headers 
       csv_writer.writerow(lst) 
     except: 
      with open(file,'r',encoding='utf8') as infile: 
       file=file[file.rfind('\\')+1:] 
       reader=csv.reader(infile) 
       headers=next(reader) 
       headers=[str for str in headers if str] 
       while len(headers) < 3 : 
        headers=next(reader) 
        headers=[str for str in headers if str] 
       lst=[file]+headers 
       csv_writer.writerow(lst) 

而這個錯誤c AME出來:

Traceback (most recent call last): 
    File "C:\Python35\2.py", line 12, in <module> 
    headers=next(reader) 
UnicodeDecodeError: 'cp949' codec can't decode byte 0xec in position 6: illegal multibyte sequence 

在處理上述異常,另一個異常:

Traceback (most recent call last): 
    File "C:\Python35\2.py", line 20, in <module> 
    with open(file,'r',encoding='utf8') as infile: 
FileNotFoundError: [Errno 2] No such file or directory: '2010_1_1.csv' 

文件'2010_1_1.csv'在我的目錄肯定存在('C:/dataset/*.csv')

當我嘗試逐一打開此文件使用open('C:/dataset/2010_1_1.csv','r',encoding='utf8')它可以工作,但文件名旁邊有'\ ufeff'。

我不知道,但我的猜測是,該文件正在打開try:尚未關閉,因此python無法打開此文件在except

如何編輯我的代碼以解決此Unicode問題?


import glob 
from chardet.universaldetector import UniversalDetector 
files=glob.glob('C:/example/*.csv') 
for filename in files: 
print(filename.ljust(60)), 
detector.reset() 
for line in file(filename, 'rb'): 
    detector.feed(line) 
    if detector.done: break 
detector.close() 
print(detector.result) 

錯誤:

Traceback (most recent call last): 
    File "<pyshell#20>", line 4, in <module> 
    for line in file(filename, 'rb'): 
TypeError: 'str' object is not callable 
+0

這是非常糟糕的格式。 – Nabin

+0

@Nabin對不起..我盡我所能,但我的代碼和我的問題是凌亂。 –

+0

for'file not found'錯誤,你確定你的代碼是以'C:/ dataset /'作爲其工作目錄嗎?你可以使用'os.getcwd()'來查明。我不確定編碼。 – Stael

回答

0

我不是很有經驗的Python這麼叫我出來的,這是不可能的,但你可以簡單地試圖忽略這些文件的編碼時開放它。我是一名Java程序員,根據我的經驗,編碼只需在創建新文件時指定,而不是在打開文件時指定。

+0

感謝您的意見。但是,正如我上面提到的那樣,當我單獨執行時,它是有效的。我不知道哪些文件導致錯誤,而無需每次我的代碼停止時手動檢查它們。當我想通過使用'try'和'except'來完成這項工作時,它就不起作用。 –

0

它看起來像你的文件沒有寫在cp949如果它不會正確解碼。你必須找出正確的編碼。像chardet這樣的模塊可以提供幫助。

在Windows上,在讀取文件時,用寫入的編碼打開文件。如果使用UTF-8,則使用utf-8-sig,它將自動處理並刪除字節順序標記(BOM)U+FEFF字符(如果存在)。在編寫時,最好的辦法是使用utf-8-sig,因爲它可以處理所有可能的Unicode字符,並且會添加BOM,因此Windows工具(如記事本和Excel)將識別UTF-8編碼的文件。沒有它,大多數Windows工具都會採用ANSI編碼,每種本地化版本的Windows都會有所不同。

+0

我試着用'open'檢查文件的編碼,結果是所有文件的編碼都是'cp949',這很奇怪。當我通過在Excel中手動打開導致錯誤的csv文件時,他們的格式與那些工作的文件不同。例如,如果(1,2)是NAME,那麼第2列的每一行都應該是NAME,但在某些行中,不是將多個名稱放在一個單元格(第2列)中,而是將每個名稱記錄在從2到任意的每列中,因此行的長度彼此不同。 –

+0

我將嘗試chardet再次檢出編碼。 –

+0

'open'不檢測編碼,這只是系統的默認設置。你必須知道正在打開的文件的正確編碼。 –

相關問題