csv文件中的混合编码

时间:2016-05-16 21:50:32

标签: python r csv encoding utf-8

我在R中有一个相当大的数据库(10,000多条记录,每条约120个变量)。问题是,原始.csv文件中大约一半的变量是以UTF-8正确编码的,而其余的则是编码的在ANSI(Windows-1252)中,但正在被解码为UTF-8,导致非ASCII字符(主要是拉丁语)的奇怪字符,如éó

我不能简单地更改文件编码,因为它的一半会被错误的类型解码。此外,我无法知道哪些列是正确编码的,哪些列没有编码,而我所拥有的只是我尝试修复的原始.csv文件。

到目前为止,我发现纯文本文件可以用UTF-8编码,并且可以推断出错误解释的字符(坏的Unicode)。一个提供此类功能的库是ftfy用于Python。但是,我使用以下代码,到目前为止,还没有成功:

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,但似乎有点复杂

有什么建议吗?

2 个答案:

答案 0 :(得分: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文件。

答案 1 :(得分:1)

一个小小的建议:分而治之。 尝试使用一个工具(ftfy?)将所有文件对齐到相同的编码(并保存为纯文本文件),然后尝试将其解析为csv