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