Python打开的CSV文件与所谓的混合编码?

时间:2015-02-18 19:58:40

标签: python csv encoding utf-8 character-encoding

我正在尝试使用Python读取CSV文本文件( UTF-8,不含BOM,根据Notepad ++ )。但是编码似乎存在问题:

print(open(path, encoding="utf-8").read())
  

Codec无法解码字节 08xf

这个小角色似乎是问题所在:(完整字符串:“●••อีเปียขี้บ่น●●”),但我相信会有更多。

如果我尝试使用UTF-16,则会显示一条消息:

#also tried with encode
print(open(path, encoding="utf-16").read().encode('utf-8'))
  

非法的UTF-16代理人

即使我尝试使用自动编解码器查找器打开它,我也会收到错误消息。

def csv_unireader(f, encoding="utf-8"):
    for row in csv.reader(codecs.iterencode(codecs.iterdecode(f, encoding), "utf-8")):
        yield [e.decode("utf-8") for e in row]

我在俯瞰什么?该文件包含Twitter文本,其中包含许多不同的字符,这是肯定的。但是这在Python中不是一项如此困难的任务,只是阅读/打印文件?

修改

尝试使用此答案中的代码:https://stackoverflow.com/a/14786752/45311

import csv

with open('source.csv', newline='', encoding='utf-8') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

这至少会在屏幕上打印一些行,但在某些行之后也会抛出错误:

  

cp850.py ,第19行,编码   return codecs.charmap_encode(input,self.errors,encoding_map)[0]   UnicodeEncodeError:'charmap'编解码器无法编码62-63位的字符:   字符映射到

似乎自动使用CP850这是另一种编码......我无法理解这一切......

2 个答案:

答案 0 :(得分:1)

你的python的版本是什么? 如果使用2.x尝试将导入粘贴到脚本的开头:

from __future__ import unicode_literals

而不是尝试:

print(open(path).read().encode('utf-8'))

还有一个很棒的charset检测工具:chardet。 我希望它会帮助你。

答案 1 :(得分:1)

您可以在open函数中使用 errors 参数。您可以尝试下面的选项之一(我从python文档中提取了描述):

  • '忽略'忽略错误。请注意,忽略编码错误可能会导致数据丢失。
  • '替换'导致替换标记(例如'?')插入有错误数据的位置。
  • ' surrogateescape'将表示任何不正确的字节作为Unicode专用区中的代码点,范围从U + DC80到U + DCFF。当在写入数据时使用surrogateescape错误处理程序时,这些私有代码点将被转回到相同的字节中。这对于处理未知编码的文件非常有用。

所以,你可以使用:

print(open(path, encoding="utf-8", errors="ignore").read())