为什么 openpyxl 将列表读取为 unicode?
Why does openpyxl read a list as unicode?
我正在使用 openpyxl
库从 Excel sheet 中读取数据。示例单元格可能包含一个列表,如 [[0, 1, 2, 3], [4, 5, 6, 7]]
、一个整数,如 5
,或一个字符串,如 sample string
。
整数被正确读取为整数,但字符串和列表都被读取为 unicode:
print "{} is {}".format(data, type(data))
产量
5 is <type 'int'>
[[0, 1, 2, 3], [4, 5, 6, 7]] is <type 'unicode'>
sample string is <type 'unicode'>
我想防止列表被读取为 unicode,或者找到将 unicode 适当地转换为列表和字符串的修复程序。
这是修复此问题的失败尝试:
def remove_unicode(data):
if isinstance(data, unicode):
return data.encode('utf-8')
当然,问题是列表作为字符串返回。如果返回字符串中的第一个和最后一个字符是 [
和 ]
,我可以通过将类型更改为 list 来改进这一点,但这看起来很笨拙。我怀疑更好的解决方案是首先防止我的列表和字符串被读取为 unicode。
A sample cell might contains a list like [[0, 1, 2, 3], [4, 5, 6, 7]]
它不能包含这样的列表,因为列表不是 Excel 数据类型。你所拥有的只是一个字符串,openpyxl 正确地将它解释为一个字符串,而不是试图猜测你是否希望将它解释为以某种方式编码的对象。 (见禅:"In the face of ambiguity, refuse the temptation to guess.")
如果要将类似于 Python 整数列表的字符串表示形式的内容转换为列表,可以使用 ast.literal_eval
:
>>> sheet
<Worksheet "Sheet1">
>>> sheet.cell("A1").value
'[[1,2,3,4],[5,6,7,8]]'
>>> type(_)
<class 'str'>
>>> import ast
>>> ast.literal_eval(sheet.cell("A1").value)
[[1, 2, 3, 4], [5, 6, 7, 8]]
>>> type(_)
<class 'list'>
或(在这种情况下,无论如何)json.loads
。请注意,我得到 str
作为数据类型而不是 unicode
因为我使用的是 Python 3.
我正在使用 openpyxl
库从 Excel sheet 中读取数据。示例单元格可能包含一个列表,如 [[0, 1, 2, 3], [4, 5, 6, 7]]
、一个整数,如 5
,或一个字符串,如 sample string
。
整数被正确读取为整数,但字符串和列表都被读取为 unicode:
print "{} is {}".format(data, type(data))
产量
5 is <type 'int'>
[[0, 1, 2, 3], [4, 5, 6, 7]] is <type 'unicode'>
sample string is <type 'unicode'>
我想防止列表被读取为 unicode,或者找到将 unicode 适当地转换为列表和字符串的修复程序。
这是修复此问题的失败尝试:
def remove_unicode(data):
if isinstance(data, unicode):
return data.encode('utf-8')
当然,问题是列表作为字符串返回。如果返回字符串中的第一个和最后一个字符是 [
和 ]
,我可以通过将类型更改为 list 来改进这一点,但这看起来很笨拙。我怀疑更好的解决方案是首先防止我的列表和字符串被读取为 unicode。
A sample cell might contains a list like [[0, 1, 2, 3], [4, 5, 6, 7]]
它不能包含这样的列表,因为列表不是 Excel 数据类型。你所拥有的只是一个字符串,openpyxl 正确地将它解释为一个字符串,而不是试图猜测你是否希望将它解释为以某种方式编码的对象。 (见禅:"In the face of ambiguity, refuse the temptation to guess.")
如果要将类似于 Python 整数列表的字符串表示形式的内容转换为列表,可以使用 ast.literal_eval
:
>>> sheet
<Worksheet "Sheet1">
>>> sheet.cell("A1").value
'[[1,2,3,4],[5,6,7,8]]'
>>> type(_)
<class 'str'>
>>> import ast
>>> ast.literal_eval(sheet.cell("A1").value)
[[1, 2, 3, 4], [5, 6, 7, 8]]
>>> type(_)
<class 'list'>
或(在这种情况下,无论如何)json.loads
。请注意,我得到 str
作为数据类型而不是 unicode
因为我使用的是 Python 3.