Python csv文件中的混合编码

Python csv文件中的混合编码,python,r,csv,encoding,utf-8,Python,R,Csv,Encoding,Utf 8,我在R中有一个相当大的数据库(10000多条记录,每条记录大约120个变量)。问题是,原始.csv文件中大约一半的变量正确地用UTF-8编码,而其余的变量则用ANSI(Windows-1252)编码,但被解码为UTF-8,导致非ASCII字符(主要是拉丁语)出现奇怪的字符像这样或ó 我不能简单地更改文件编码,因为其中一半会被错误的类型解码。此外,我无法知道哪些列编码正确,哪些列编码错误,而我所拥有的只是我试图修复的原始.csv文件 到目前为止,我发现纯文本文件可以用UTF-8编码,并且可以推断

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

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

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

导入ftfy
file=open(“file.csv”,“r”,encoding=“UTF8”)
content=file.read()
content=ftfy.fix\u文本(content)
但是,
内容
将显示与以前完全相同的文本。我相信这与ftfy推断内容编码的方式有关

然而,如果我运行
ftfy.fix_text(“pÃ:blica que cotiza en México”)
它将显示正确的响应:

>> 'Pública que cotiza en México'
我认为解决这个问题的方法可能是迭代.csv文件中的每个值(单元格),并尝试用ftfy修复if,然后将文件导入到R,但这似乎有点复杂


有什么建议吗?

一个小建议:分而治之。
尝试使用一个工具(ftfy?)将所有文件对齐到相同的编码(并另存为纯文本文件),然后才尝试将其解析为csv。事实上,在多个位置存在随机单元格的混合编码。从原始源导出数据时可能会出现问题

ftfy的问题是它逐行处理文件,如果遇到格式良好的字符,它会假定整行都是以相同的方式编码的,并且需要使用奇怪的字符

由于这些错误在所有文件中都是随机出现的,所以我无法转换整个表并处理每一行(列),所以答案是逐个单元格处理。幸运的是,Python有一个标准库,它提供了使用csv无痛苦工作的功能(特别是因为它可以正确地转义单元格)

这是我用来处理文件的代码:

导入csv
进口ftfy
导入系统
def总管(argv):
#输入文件
csvfile=open(argv[1],“r”,encoding=“UTF8”)
reader=csv.DictReader(csvfile)
#输出流
outfile=open(argv[2],“w”,encoding=“Windows-1252”)#Windows不喜欢utf8
writer=csv.DictWriter(outfile,fieldnames=reader.fieldnames,lineterminator=“\n”)
#清洁价值观
writer.writeheader()
对于读取器中的行:
对于行中的列:
行[col]=ftfy.fix\u文本(行[col])
writer.writerow(行)
#关闭文件
csvfile.close()
outfile.close()
如果名称=“\uuuuu main\uuuuuuuu”:
主(系统argv)
然后,打电话:

$ python fix_encoding.py data.csv out.csv

将输出一个编码正确的csv文件。

如果该文件是混合编码的,并且您使用的是UTF-8,那么您将收到到处都是的UnicodeDecode错误。听起来更像是字符被错误地存储在数据库中。按建议使用ftfy。可能在返回resultNice解决方案之前,在CSV模块周围编写一个包装器,通过ftfy进行解析。尽管我发现使用csv.reader和csv.writer更简单,因为您不必处理标题、字典等。