【问题标题】:UnicodeDecodeError: 'ascii' codec can't decode byte 0xea in position 8: ordinal not in range(128)UnicodeDecodeError:“ascii”编解码器无法解码位置 8 的字节 0xea:序数不在范围内(128)
【发布时间】:2014-03-08 09:38:15
【问题描述】:

我正在将从作业 API 获取的数据写入 Google 电子表格。在对“latin-1”进行编码之后,会一直编码到第 93 页,但当达到 94 时,它会进入异常状态。我使用了不同的以下技术,但“latin-1”做了最大分页。其他人已被评论(因为他们死在第 65 页)。您能否告诉我如何修改未注释的(即 .encode('latin-1')) 以在电子表格上安全地写入 199 页? 代码如下: 在这方面的任何指导方针都提前表示赞赏。

  def append_data(self,worksheet,row,start_row, start_col,end_col):
    r = start_row #last_empty_row(worksheet)
    j = 0
    i = start_col
    while (i <= end_col):
        try:
            worksheet.update_cell(r,i,unicode(row[j]).encode('latin-1','ignore'))
            #worksheet.update_cell(r,i,unicode(row[j]).decode('latin-1').encode("utf- 
             16"))
            #worksheet.update_cell(r,i,unicode(row[j]).encode('iso-8859-1'))
            #worksheet.update_cell(r,i,unicode(row[j]).encode('latin-1').decode("utf-
            8"))
            #worksheet.update_cell(r,i,unicode(row[j]).decode('utf-8'))
            #worksheet.update_cell(r,i,unicode(row[j]).encode('latin-1', 'replace'))
            #worksheet.update_cell(r,i,unicode(row[j]).encode(sys.stdout.encoding,  
            'replace'))
            #worksheet.update_cell(r,i,row[j].encode('utf8'))
            #worksheet.update_cell(r,i,filter(self.onlyascii(str(row[j]))))      

        except Exception as e:  
            self.ehandling_obj.error_handler(self.ehandling_obj.SPREADSHEET_ERROR,[1])
            try:
                worksheet.update_cell(r,i,'N/A')
            except Exception as ee:
                y = 23
        j = j + 1
        i = i + 1

【问题讨论】:

  • 有问题的单元格中有什么,回溯是什么样的?

标签: python excel oop google-sheets


【解决方案1】:

您正在对字节字符串值调用unicode(),这意味着 Python 必须先解码为 Unicode:

>>> unicode('\xea')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xea in position 0: ordinal not in range(128)

失败的是这种解码,不是从 Unicode 编码回字节字符串。

您已经有 Latin-1 输入数据,或者您应该使用适当的编解码器进行解码:

unicode(row[j], 'utf8').encode('latin1')

或使用str.decode():

row[j].decode('utf8').encode('latin1')

我在这里选择了 UTF-8 作为示例,您没有提供有关输入数据或其可能编码的任何详细信息。您需要在此处自行选择正确的编解码器。

【讨论】:

  • 我像这样从页面中获取数据,实际上我必须根据用户条件查看作业。我通过实现python的请求库来获得json数组。一页作为样本分享:api.angel.co/1/jobs
  • 对于抛出异常的一行,repr(row[j]) 打印什么?
  • 感谢您的指导,但事实是,我已经运行了您对编码的所有三个建议。这些都不起作用。他们都在第 65 页抛出异常。
  • 唯一一个成功从第65页成功,我已经在帖子中分享了。此命令:worksheet.update_cell(r,i,unicode(row[j]).encode('latin-1','ignore')) BUt t 在第 94 页抛出异常。你能告诉我发生了什么事吗?
  • 不知道,不是没有看到您尝试处理的实际数据和异常的完整回溯。否则这只是一个猜谜游戏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-24
  • 2011-05-13
  • 2014-02-19
  • 2018-07-26
  • 2020-11-06
  • 2014-08-12
相关资源
最近更新 更多