2016-05-16 83 views
1

我有一個相當大的數據庫(10,000多條記錄,每個記錄大約有120個變量)。問題是,大約一半的原始.csv文件中的變量被正確編碼爲UTF-8而其餘的則以ANSI(Windows-1252)編碼,但被解碼爲UTF-8,導致非ASCII字符(主要是拉丁字符)的奇怪字符,如éócsv文件中的混合編碼

我不能簡單地改變文件編碼,因爲它的一半將被解碼爲錯誤的類型。此外,我無法知道哪些列編碼正確,哪些沒有正確編碼,而我所擁有的就是我試圖修復的原始.csv文件。

到目前爲止,我發現純文本文件可以使用UTF-8編碼,並且可以推斷出錯誤解釋的字符(錯誤的Unicode)。一個提供這種功能的庫是Python的ftfy。但是,我使用下面的代碼,到目前爲止,還沒有成功:

import ftfy 

file = open("file.csv", "r", encoding = "UTF8") 
content = file.read() 

content = ftfy.fix_text(content) 

然而,content將準確顯示比以前相同的文本。我相信這與ftfy推斷內容編碼的方式有關。

不過,如果我跑ftfy.fix_text("Pública que cotiza en México")它會顯示正確的反應:

>> 'Pública que cotiza en México' 

我在想,也許解決問題的方法是通過在每一個的值(細胞)進行迭代。 csv文件,並嘗試修復如果與ftfy,並將文件導回到R,但它似乎有點複雜

有什麼建議嗎?

+1

如果該文件是混合編碼,並且您使用的是UTF-8,那麼您會在所有位置都收到UnicodeDecode錯誤。這聽起來更像是字符被錯誤地存儲在數據庫中。按照建議使用ftfy。也許在返回結果 –

回答

2

實際上,有幾種隨機單元的混合編碼地方。從其原始源導出數據時可能存在問題。

ftfy的問題在於它一行一行地處理文件,並且如果遇到格式化的字符,它會假設整行以相同的方式編碼,並且意圖使用奇怪的字符。

由於這些錯誤是通過所有文件隨機出現的,因此我無法轉置整個表並處理每一行(列),所以答案是逐個處理。幸運的是,Python有一個標準庫,它提供了使用csv輕鬆工作的功能(特別是因爲它正確地轉義了單元格)。

這是我用來處理文件的代碼:

import csv 
import ftfy 
import sys 

def main(argv): 
    # input file 
    csvfile = open(argv[1], "r", encoding = "UTF8") 
    reader = csv.DictReader(csvfile) 

    # output stream 
    outfile = open(argv[2], "w", encoding = "Windows-1252") # Windows doesn't like utf8 
    writer = csv.DictWriter(outfile, fieldnames = reader.fieldnames, lineterminator = "\n") 

    # clean values 
    writer.writeheader() 
    for row in reader: 
     for col in row: 
      row[col] = ftfy.fix_text(row[col]) 
     writer.writerow(row) 

    # close files 
    csvfile.close() 
    outfile.close() 

if __name__ == "__main__": 
    main(sys.argv) 

,然後美其名曰:

$ python fix_encoding.py data.csv out.csv 

將輸出與正確的編碼csv文件。

+0

好的解決方案前寫一個圍繞CSV模塊的包裝來解析通過ftfy。儘管我發現使用csv.reader和csv.writer更簡單,因爲您不必處理標題,字典等。 – AlexanderMP

1

一個小建議:分而治之。 嘗試使用一個工具(ftfy?)將所有文件對齊到相同的編碼(並保存爲純文本文件),然後嘗試解析爲csv