【问题标题】:Why does openpyxl read a list as unicode?为什么 openpyxl 将列表读取为 unicode?
【发布时间】:2015-10-26 16:15:01
【问题描述】:

我正在使用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。

【问题讨论】:

  • 为了清楚起见,听起来您认为列表是基本的 Excel 类型,而 Python 将它们误解为字符串。对吗?
  • @DSM 我不希望列表是基本的 Excel 类型。我所期待的是,当导入 Python 环境时,openpyxl 会将包含 [[0, 1, 2, 3], [4, 5, 6, 7]] 之类的单元格解释为列表。相反,它似乎将其解释为 unicode。我的假设可能是不正确的,并且几乎肯定会导致我遇到的问题。
  • 根据规范,单元格的数据类型可以是数字、布尔值、字符串、公式或错误。从理论上讲,它甚至可以是一个日期时间。但是,没有像数组这样的复合数据类型。你要什么就像说 x = '[1, 2, 3]' 并期望 Python 将 x 视为一个列表。它没有,而且有很好的理由。

标签: python excel list unicode openpyxl


【解决方案1】:

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

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

如果您想将类似于 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。

【讨论】:

  • 完美——这清楚地表明了我的哪些假设是不正确的以及如何解决它。
猜你喜欢
  • 2019-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 2011-03-17
  • 2019-06-17
相关资源
最近更新 更多