【问题标题】:'utf8' codec can't decode byte 0xbd CSV file 1/2 Char“utf8”编解码器无法解码字节 0xbd CSV 文件 1/2 字符
【发布时间】:2013-11-08 13:15:31
【问题描述】:

我正在通过 Django 上传文件控件读取 CSV 文件。

我想将½ (1/2) 存储到数据库中,但它给出了以下异常:

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

'utf8' 编解码器无法解码位置 45 中的字节 0xbd:无效起始字节

【问题讨论】:

  • 你能告诉我们Django视图的代码吗?您如何阅读 CSV 文件?
  • 你确定是utf-8编码的吗?
  • with open(Customer.get_temp_file_name(), 'r') as data_file: reader = MyFileReader(_file=data_file) def __init__(self, _file=None): if _file: self.DATA_FILE = csv .DictReader(_file)
  • 好吧,我不确定,如果它是 utf-8,因为我已经尝试了所有方法来转换 1/2,但没有任何效果
  • @Cannon:你可以edit你的问题添加细节。

标签: python python-2.7 csv unicode


【解决方案1】:

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

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

【讨论】:

  • 完美,我认为这是更简单的方法。只是将 csv 文件转换为 UTF-8 并再次上传。 1/2 字符已正确保存。谢谢+1
  • 不客气。如果它解决了您的问题,请“接受”我的回答(点击对勾)。
【解决方案2】:

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

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

【讨论】:

  • 如果django期待utf8,最简单的就是给它utf8。
  • @alexis,根据错误消息,它已经在执行decode。我敢打赌,如果它已经给出了 Unicode,它会跳过它。
  • @MarkRansom:网络上传总是字节流,要获得 unicode,它必须解码。您无法从 Web 请求中接收 Unicode。还是您声称 UTF8 是 Unicode;它是一种编码,而不是标准或 Python unicode 值。
  • @MartijnPieters,如果是这样,那它为什么要首先尝试decode?我承认我对 Django 了解不多。
  • @MarkRansom:为什么不呢?当您可以操作日期时间对象时,为什么还要操作日期字符串?如果可以有数字,为什么要操作字符串中的数字?在处理文本时,在边界处解码为 un​​icode 是有意义的。
猜你喜欢
  • 2016-08-03
  • 2012-08-08
  • 1970-01-01
  • 2019-03-13
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多