首页 > 解决方案 > 找不到用于读取 csv 的正确编解码器

问题描述

我正在阅读一个 csv 文件,这是针对来自网络协议、十六进制字符和普通混合的一些痕迹。我正在尝试读取 .csv,并且尝试了几种编码:utf-8、cp1252、latin1...

对于latin1

UnicodeEncodeError:“ascii”编解码器无法在位置 51 编码字符 u'\xb0':序数不在范围内(128)

对于utf-8

UnicodeDecodeError:“utf8”编解码器无法解码位置 51 中的字节 0xb0:无效的起始字节

对于cp1252

UnicodeEncodeError:“ascii”编解码器无法在位置 51 编码字符 u'\xb0':序数不在范围内(128)

使用的代码是:

df=pd.read_csv(file,sep='`',error_bad_lines=False,encoding='cp1252',names=colnames,quotechar='"')

我不是编码方面的大专家,但我想知道如何解决它。

找出我正在阅读的 csv 文件的当前编码?

是否有一个非常宽松的编解码器可以处理几乎所有内容?

谢谢。

标签: pythonpandasutf-8asciicodec

解决方案


CSV 是一种文本格式;它并不适合存储任意二进制数据块。

为了解决您的直接问题,您可以指定´latin-1'为编码。该编解码器的独特之处在于每个单字节字符对应完全相同的 Unicode 代码点。

但是请注意,如果您不小心,这很可能会产生各种mojibake 。您可能应该提取任何二进制数据,然后尽快将剩余字段解码为正确的 Unicode。这是一个用于 UTF-8 的简单纯 Python 片段,其中一个字段包含二进制文件。

with open(filename, encoding='latin-1') as input:
    reader = csv.reader(input)
    for row in reader:
        binary = row[42].encode('latin-1')
        newrow = []
        for field in row:
            newrow.append(field.encode('latin-1').decode('utf-8'))
        newrow[42] = binary
        # newrow is now decoded UTF-8 except field 42 which is a bytes object

推荐阅读