找不到正确的编解码器来读取csv

时间:2019-07-04 11:26:12

标签: python pandas utf-8 ascii codec

我正在读取一个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文件的当前编码吗?

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

谢谢。

3 个答案:

答案 0 :(得分:1)

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

要解决当前的问题,可以指定´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

答案 1 :(得分:-1)

首先找出编码类型,然后将其用于阅读

要查找编码类型:

方法:1 您只需使用记事本打开文件,然后转到文件->另存为。在“保存”按钮旁边,将有一个编码下拉菜单,并且将在此处选择文件的当前编码。 方法:2 在Linux系统中,您可以使用file命令。它将给出正确的编码

    > file sub01.csv
  

sub01.csv:ASCII文本

答案 2 :(得分:-1)

用于读取csv文件

import csv
def unicode_csv_reader(utf8_data, dialect=csv.excel, **kwargs):
   csv_reader = csv.reader(utf8_data, dialect=dialect, **kwargs)
   for row in csv_reader:
      yield [unicode(cell, 'utf-8') for cell in row]
   filename = 'da.csv'
   reader = unicode_csv_reader(open(filename))
   for field1, field2, field3 in reader:
       print field1, field2, field3