我正在读取一个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文件的当前编码吗?
是否有一个非常宽松的编解码器,可以容纳几乎所有内容?
谢谢。
答案 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