UnicodeEncodeError 与 xlrd

UnicodeEncodeError with xlrd

我正在尝试使用 xlrd 读取 .xlsx。我已经设置好一切并开始工作了。它适用于具有普通英文字母和数字的数据。然而,当涉及到瑞典字母 (ÄÖÅ) 时,它给了我这个错误:

print str(sheet.cell_value(1, 2)) + " " + str(sheet.cell_value(1, 3)) + " " + str(sheet.cell_value(1, 4)) + " " + str(sheet.cell_value(1, 5))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xd6' in position 1: ordinal not in range(128)

我的代码:

# -*- coding: cp1252 -*-
import xlrd

file_location = "test.xlsx"

workbook = xlrd.open_workbook(file_location)
sheet = workbook.sheet_by_index(0)

print str(sheet.cell_value(1, 2)) + " " + str(sheet.cell_value(1, 3)) + " " + str(sheet.cell_value(1, 4)) + " " + str(sheet.cell_value(1, 5))

我什至尝试过:

workbook = xlrd.open_workbook("test.xlsx", encoding_override="utf-8")

以及:

workbook = xlrd.open_workbook("test.xlsx", encoding="utf-8")

编辑:我是 运行 Python 2.7 Windows 7 64 位计算机。

'ascii' codec can't encode

这里的问题不是读取文件时的解码,而是打印时需要的编码。您的环境正在为 sys.stdout 使用 ASCII,因此当您尝试打印任何无法以 ASCII 编码的 Unicode 字符时,您将收到该错误。

Documentation reference:

The character encoding is platform-dependent. Under Windows, if the stream is interactive (that is, if its isatty() method returns True), the console codepage is used, otherwise the ANSI code page. Under other platforms, the locale encoding is used (see locale.getpreferredencoding()).

Under all platforms though, you can override this value by setting the PYTHONIOENCODING environment variable before starting Python.

尝试使用 utf-8 作为 @Anand S Kumar 建议并在打印前使用 decode 字符串。

# -*- coding: utf-8 -*-
import xlrd

file_location = "test.xlsx"

workbook = xlrd.open_workbook(file_location)
sheet = workbook.sheet_by_index(0)

cells = [sheet.cell_value(1, i).decode('utf-8') for i in range(2, 6)]
print ' '.join(cells)

xlrd 默认使用 Unicode 编码。如果 xlrd 无法识别编码,那么它将认为 excel 文件中使用的编码是 ASCII,字符编码。最后,如果编码不是 ASCII 或者 python 无法将数据转换为 Unicode,那么它将引发 UnicodeDecodeError。

别担心,我们有解决此类问题的方法。看来你用的是cp1252。因此,当您将使用 open_workbook() 打开文件时,您可以按如下方式调用它:

>>> book = xlrd.open_workbook(filename='filename',encoding_override="cp1252")

当您使用上述函数时,xlrd 将解码相应的编码,您就可以开始了。
来源:

  1. Standard Encodings.
  2. xlrd official documentation
  3. UnicodeDecodeError