我正在处理从test.xls
文件中读取的数据,如下所示:
from sys import exe_info
try:
book = xlrd.open_workbook('test.xls')
sh = book.sheet_by_index(0)
for row in range( 1, sh.nrows ):
for index, value in enumerate(sh.row_values(row)):
process_value(value)
except:
print exc_info()[1]
如果在处理process_value(value)
时出现异常,则意味着.xls
文件的特定行中存在一些错误。但是当我打印exc_info()[1]
时,我能够获得关于
'ascii' codec can't encode characters in position 7-10: ordinal not in range(128)
但如果我打印exc_info()
函数,它会提供以下输出
(<type 'exceptions.UnicodeEncodeError'>, UnicodeEncodeError('ascii', u'bokor b\xe3\u0192\xe2\xa9la', 7, 11, 'ordinal not in
range(128)'), <traceback object at 0x01067080>)
因此,如果我想向用户显示异常,那么用户会对导致错误的that.xls
文件的特定行感兴趣。在exc_info()
的输出中我可以看到单词
u'bokor b\xe3\u0192\xe2\xa9la'
这是XLS文件中的单词。如果我不能显示哪个行错误引起,如果我至少显示上面的单词,将有助于找到该单词并删除该单词。
我无法从exc_info()
得到那个特定的词,或者他们有更好的方法来处理这种情况吗?
答案 0 :(得分:1)
xlrd
将所有文本单元格的内容作为unicode
个对象返回。您不需要知道“正确的编码” - 它不是编码的。
我建议你做这样的事情:
for row in xrange(1, sh.nrows):
for index, value in enumerate(sh.row_values(row)):
try:
process_value(value)
except:
print >> sys.stderr, row, index, repr(value)
raise
这使您能够显示所有相关数据,然后重新引发异常,以便获得格式化的错误消息并为您完成回溯。
如果您向我们展示process_value
函数的代码,您可能会帮助我们吗?您是明确地还是隐含地尝试unicode_object.encode('ascii')
?