Python xlutils 保存中文内容报错"us = unicode(s, encoding)"和"UnicodeDecodeError: 'ascii' codec can't decode "

1 篇文章 0 订阅
1 篇文章 0 订阅

使用Python xlutils 保存中文内容:

样例脚本:

import xlutils.copy
file_name = "test.xls"

#读取文件
read_file = xlrd.open_workbook(file_name)
#参数注释:
#file_path:文件路径,包含文件的全名称
#formatting_info=True:保留Excel的原格式

#将文件复制到内存
write_data = xlutils.copy.copy(read_file)

#读取复制后文件的sheet1
write_save = write_data.get_sheet(0)

#写入数据
write_save.write(1,1,"测试2")
#参数注释:
#x,y:写入目标格的位置坐标
#value:写入数据

#保存写入数据后的文件到原文件路径
write_data.save(file_name)

出现如下错误:

Traceback (most recent call last):
  File "G:\eclipse\eclipse-workspace\Demo\reTest.py", line 70, in <module>
    write_data.save(file_name)
  File "C:\Python27\lib\site-packages\xlwt\Workbook.py", line 710, in save
    doc.save(filename_or_stream, self.get_biff_data())
  File "C:\Python27\lib\site-packages\xlwt\Workbook.py", line 674, in get_biff_data
    shared_str_table   = self.__sst_rec()
  File "C:\Python27\lib\site-packages\xlwt\Workbook.py", line 636, in __sst_rec
    return self.__sst.get_biff_record()
  File "C:\Python27\lib\site-packages\xlwt\BIFFRecords.py", line 77, in get_biff_record
    self._add_to_sst(s)
  File "C:\Python27\lib\site-packages\xlwt\BIFFRecords.py", line 92, in _add_to_sst
    u_str = upack2(s, self.encoding)
  File "C:\Python27\lib\site-packages\xlwt\UnicodeUtils.py", line 50, in upack2
    us = unicode(s, encoding)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)

在网上查找到的方法是:

注释如下代码

     if isinstance(s, unicode_type):
         us = s
     else:
         us = unicode(s, encoding)

修改成下图中的代码样式

def upack2(s, encoding='ascii'):
     # If not unicode, make it so.
     '''
     if isinstance(s, unicode_type):
         us = s
     else:
         us = unicode(s, encoding)
     '''
     if isinstance(s, unicode):
         us = s
     elif s is not None:
         us = unicode(s, encoding)
     else:
         us = unicode('', encoding)
     # Limit is based on number of content characters
     # (not on number of bytes in packed result)

修改后还是报错。

最终排查发现是在写入数据时因为数据的编码格式造成的问题:

#修改前
#报错的
write_save.write(1,1,"测试2")

#修改后
#正常的
write_save.write(1,1,u"测试2")

 

 

UnicodeDecodeError: 'ascii' codec can't decode byte 0x91 in position 1: ordinal not in range(128) 是一个编码解码错误,表示在尝试将一个ASCII编码的字符串解码为Unicode时出现了问题。这通常是因为文本中包含了非ASCII字符,而解码器默认使用的是ASCII编码。要解决这个问题,可以采取以下方法: 1. 使用合适的编码解码器:可以使用适当的编码解码器,如UTF-8,来解码包含非ASCII字符的文本。例如,在Python中,可以使用str对象的decode()方法来指定合适的解码器,如decode('utf-8')。 2. 指定文件的编码格式:如果该问题是在读取文件时出现的,可以在打开文件时指定正确的编码格式。例如,在Python中,可以使用open()函数的encoding参数来指定编码格式,如open('file.txt', encoding='utf-8')。 3. 处理非ASCII字符:如果需要处理非ASCII字符,可以使用相应的编码进行处理。在Python中,可以使用encode()方法将Unicode字符串编码为指定的编码格式,如encode('utf-8')。 4. 使用合适的工具:如果以上方法不能解决问题,可能需要使用专门处理Unicode编码的工具或库来处理非ASCII字符。例如,在Python中,可以使用unicodedata模块来处理Unicode字符。 总结一下,UnicodeDecodeError: 'ascii' codec can't decode byte 0x91 in position 1: ordinal not in range(128) 是由于尝试将ASCII编码的字符串解码为Unicode时出现了问题,可以通过使用合适的编码解码器,指定文件的编码格式,处理非ASCII字符或使用合适的工具来解决这个问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [python解决汉字编码问题:Unicode Decode Error](https://download.csdn.net/download/weixin_38698433/14912364)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [pickle.load出现UnicodeDecodeError: ‘asciicodec can‘t decode byte 0x8b in position 6: ordinal ...](https://blog.csdn.net/weixin_43178406/article/details/129289048)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值