2013-10-29 129 views
3

我正在通过Django上传文件控件读取CSV文件。'utf8'编解码器无法解码字节0xbd CSV文件1/2字符

我想存储(1/2)到数据库中,但它提供了以下异常:

'utf8' codec can't decode byte 0xbd C.S.V. file 1/2 Char 
UnicodeDecodeError at /admin/request_system/customers/upload/ 

“utf-8”编解码器在45位置不能解码字节0xbd:无效的起始字节

+0

你能告诉我们Django视图的代码吗?你如何阅读CSV文件? –

+0

你确定它是utf-8编码吗? –

+0

张开(Customer.get_temp_file_name(), 'R')为DATA_FILE: 读者= MyFileReader(_file = DATA_FILE) DEF __init __(个体,_file =无): 如果_file: self.DATA_FILE = CSV。 DictReader(_file) – Clayton

回答

3

您的CSV文件不是utf8格式,因此解码器看到一个无效(即非utf8)字节序列。找出正确的格式并/或将CSV文件重新保存为utf8,然后重新上传。

0xbd是Latin-1中的½字符,所以这很可能是你现在拥有的。 utf8将其表示为两个字节的序列\xc2\xbd

+0

让我,现在试试吧..... – Clayton

+0

完美,我认为这是更简单的方法。只是为了将csv文件转换为UTF-8并再次上传。 1/2个字符已被正确保存。 谢谢+1 – Clayton

+0

不客气。如果它解决了您的问题,请“接受”我的回答(点击复选标记)。 – alexis

2

您正在使用错误的字符集,可能是Windows-1252。它不是Unicode或UTF-8。

s = s.decode('windows-1252') 
+0

如果django期待utf8,最简单的就是给它utf8。 – alexis

+0

@alexis,根据错误消息它已经在执行'decode'。我敢打赌,它跳过了,如果它已经给了Unicode。 –

+0

@MarkRansom:网页上传始终是字节流,以获取必须解码的Unicode。您无法从网络请求接收Unicode。或者你声称UTF8是Unicode的;它是一种编码,而不是标准或Python unicode值。 –

相关问题