2014-04-30 88 views
4

我有一個很大的csv文件,其中包含導致我嘗試運行的Python腳本中的錯誤的unicode字符。到目前爲止,我的移除過程非常繁瑣。我跑我的劇本,只要它擊中一個Unicode字符,我得到一個錯誤:將csv中的unicode轉換爲純文本的最佳方法?

'ascii' codec can't encode character u'\xef' in position 197: ordinal not in range(128) 

然後我谷歌U「\ XEF」和揣摩角色實際上是(有沒有人知道的是什麼網站上有這些定義的列表?)。我使用這些信息來建立一個字典,我的Unicode字符轉換爲普通文本第二Python腳本:

unicode_dict = {"\xb0":"deg", "\xa0":" ", "\xbd":"1/2", "\xbc":"1/4", "\xb2":"^2", "\xbe":"3/4"} 

for f in glob.glob(r"C:\Folder1\*.csv"): 
    in_csv = f 
    out_csv = f.replace(".csv", "_2.csv") 

    write_f=open(out_csv, "wb") 
    writer = csv.writer(write_f) 

    with open(in_csv,'rb') as csvfile: 
     reader = csv.reader(csvfile) 
     for row in reader: 
      new_row = [] 
      for s in row: 
       for k, v in unicode_dict.iteritems(): 
        s = s.replace(k, v) 
       new_row.append(s) 
      writer.writerow(new_row) 

    write_f.close() 
    os.remove(in_csv) 
    os.rename(out_csv, in_csv) 

然後,我必須再次運行代碼,收到其他錯誤,查查Google上的下一個unicode字符。必須有更好的方式,對吧?

+0

如果這是Python 2而不是Python 3,那麼您的字符可能不是Unicode,而是[Windows-1252](http://en.wikipedia.org/wiki/Windows-1252#Code_page_layout)或[ISO 8859- 1](http://en.wikipedia.org/wiki/Latin1#Codepage_layout)。 –

+0

@Mark:這就是OP如何解釋它們的方式。由於我們不知道他在原始文本中如何確定「\ xbd = 1/2」,所以它可能完全是其他內容 - 即西里爾語,希臘語,希伯來語或任何其他可能的8位代碼頁。 – usr2564301

+0

@Jongware,我只能假設字符在數據的上下文中是有意義的,否則這完全是另一回事。 –

回答

3

閱讀http://www.joelonsoftware.com/articles/Unicode.html。小心。

然後,你就會明白,你需要知道哪些編碼您的文件。如果你已經能夠找出\xbd手段,也許有些地方提到其編碼是。

然後,用io.open(in_csv, 'rb', encoding='yourencodinghere')代替香草open調用。

然後,顯然csv模塊不處理Unicode,感嘆。使用SBillion的答案(例如http://www.joelonsoftware.com/articles/Unicode.html)來解決它。

+0

當我讀到這個問題時,問題並不在於確定源數據的編碼方式,問題在於根據該數據創建純ASCII文件。 –

+0

我讀它的方式(見第一句)是,他的問題是特殊字符導致他的腳本失敗,並且他試圖通過手工刪除它們來解決這個問題。應該有更好的方法。 – RemcoGerlich

+0

請注意,該文檔解釋瞭如何通過標準庫在csv文件中通過utf-8執行Unicode:[13.1。 csv - CSV文件讀取和寫入 - Python v2.7.7文檔](https://docs.python.org/2/library/csv.html) – nealmcb

相關問題