Python 为什么openpyxl将列表读取为unicode?

Python 为什么openpyxl将列表读取为unicode?,python,excel,list,unicode,openpyxl,Python,Excel,List,Unicode,Openpyxl,我正在使用openpyxl库从Excel工作表中读取数据。示例单元格可能包含类似于[[0,1,2,3],[4,5,6,7]的列表,类似于5的整数,或类似于示例字符串的字符串 整数正确读取为整数,但字符串和列表均读取为unicode: print "{} is {}".format(data, type(data)) 屈服 5 is <type 'int'> [[0, 1, 2, 3], [4, 5, 6, 7]] is <type 'unicode'> sample s

我正在使用
openpyxl
库从Excel工作表中读取数据。示例单元格可能包含类似于
[[0,1,2,3],[4,5,6,7]
的列表,类似于
5
的整数,或类似于
示例字符串的字符串

整数正确读取为整数,但字符串和列表均读取为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'>
当然,问题是列表是作为字符串返回的。如果返回字符串中的第一个和最后一个字符是
[
]
,我可以通过将类型更改为list来改进这一点,但这似乎很笨拙。我怀疑一个更好的解决方案是首先防止我的列表和字符串被读取为unicode

示例单元格可能包含类似[[0,1,2,3]、[4,5,6,7]的列表

它不能包含这样的列表,因为列表不是Excel数据类型。您所拥有的只是一个字符串,openpyxl正确地将其解释为一个字符串,而不是试图猜测您是否希望将其解释为以某种方式编码的对象。(见禅宗:“面对模糊,拒绝猜测的诱惑。”)

如果要将类似于Python整数列表的字符串表示形式的内容转换为列表,可以使用:

>工作表
>>>表.单元格(“A1”).值
'[[1,2,3,4],[5,6,7,8]]'
>>>类型
>>>导入ast
>>>最终文字值(表单元格(“A1”)值)
[[1, 2, 3, 4], [5, 6, 7, 8]]
>>>类型

或者(无论如何,在本例中)
json.loads
。请注意,我将
str
作为数据类型,而不是
unicode
,因为我使用的是python3。

说得清楚一点,听起来好像您认为有列表作为基本的Excel类型,而Python将它们误解为字符串。是吗?@DSM我不希望列表是基本的Excel类型。我所期望的是openpyxl在导入Python环境时会将包含类似
[[0,1,2,3],[4,5,6,7]]
的单元格解释为列表。相反,它似乎将其解释为unicode。我的假设可能是错误的,几乎可以肯定是我遇到的问题的原因。根据规范,单元格的数据类型可以是数字、布尔值、字符串、公式或错误。理论上,它甚至可以是一个约会时间。但是,不存在数组这样的复合数据类型。您所要求的就像是说x='[1,2,3]'并期望Python将x视为一个列表。事实并非如此,原因很好。完美-这清楚地说明了我的哪些假设是错误的,以及如何修正它。
def remove_unicode(data):
    if isinstance(data, unicode):
    return data.encode('utf-8')
>>> 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'>