为什么openpyxl将列表读为unicode?

时间:2015-10-26 16:15:02

标签: python excel list unicode openpyxl

我正在使用openpyxl库从Excel工作表中读取数据。示例单元格可能包含[[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')

当然,问题在于列表以字符串形式返回。如果返回的字符串中的第一个和最后一个字符是[],我可以通过将类型更改为列表来改进这一点,但这看起来很笨拙。我怀疑更好的解决方案是防止我的列表和字符串首先被读作unicode。

1 个答案:

答案 0 :(得分:1)

  

样本单元格可能包含[[0,1,2,3],[4,5,6,7]]等列表

考虑到列表不是Excel数据类型,它不能包含这样的列表。你拥有的只是一个字符串,而openpyxl正确地将它解释为一个字符串,而不是试图猜测你是否希望它被解释为以某种方式编码的对象。 (见禅:&#34;面对模棱两可,拒绝猜测的诱惑。&#34;)

如果要将看起来像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。