【问题标题】:TypeError: coercing to Unicode: need string or buffer, Cell foundTypeError:强制转换为 Unicode:需要字符串或缓冲区,找到单元格
【发布时间】:2013-07-20 02:22:56
【问题描述】:

我尝试使用 xlrd 从 excel 加载一些记录并检查关系。 详情请参考我的业余代码:

import xlrd

feature_list_file = xlrd.open_workbook('FeatureList.xls')
feature_table = feature_list_file.sheet_by_index(0)

num_feature_rows = feature_table.nrows
num_feature_cols = feature_table.ncols

feature_list = []

for i in range(num_feature_rows):
    feature_list.append(feature_table.cell(i, 1))
# print feature_list

issue_list_file = xlrd.open_workbook('IssueList.xls')
issue_table = issue_list_file.sheet_by_index(0)

num_issue_rows = issue_table.nrows
num_issue_cols = issue_table.ncols

epic_list = []

for i in range(num_issue_rows):
    if issue_table.cell(i, 0).value == 'Epic':
        epic_list.append(issue_table.cell(i, 1).value)

# print epic_list


def check_link(actual_link, parent_list):
    result = True
    for i in range(parent_list.__len__()):
        count = 0
        if parent_list[i] in actual_link:
            count += 1
            if count > 1:
                result = False
                break
    return result


invalid_list = []

for i in range(num_issue_rows):
    if issue_table.cell(i, 10).value == '':
        invalid_list.append(issue_table.cell(i, 1).value)
    else:
        if issue_table.cell(i, 0).value == 'Story':
            if check_link(issue_table.cell(i, 10).value, epic_list):
                invalid_list.append(issue_table.cell(i, 1).value)
        if issue_table.cell(i, 0).value == 'Epic':
            if check_link(issue_table.cell(i, 10).value, feature_list):
                invalid_list.append(issue_table.cell(i, 1).value)

print invalid_list

但是,它总是返回下面的消息

Traceback (most recent call last):
  File "/Users/sut/PycharmProjects/ItemChecker/JiraItemChecker.py", line 54, in <module>
    if check_link(issue_table.cell(i, 10).value, feature_list):
  File "/Users/sut/PycharmProjects/ItemChecker/JiraItemChecker.py", line 36, in check_link
    if parent_list[i] in actual_link:
TypeError: coercing to Unicode: need string or buffer, Cell found

我该如何解决这个问题?

谢谢

【问题讨论】:

  • 您的check_link 函数不只是return actual_link in parent_list 的任何特殊原因?
  • for i in range(parent_list.__len__()): ...真的??????
  • @Jon Clements,因为 actual_link 可能是一个长字符串,其中包含一项以上的 parent_list...
  • @SUT 好的,那么有什么理由不使用any(pl in actual_link for pl in parent_list)

标签: python python-2.7 xlrd


【解决方案1】:

你正在尝试对 xlrd.cell 对象执行 in,我认为你需要更改

if parent_list[i] in actual_link:

if parent_list[i].value in actual_link:

根据您的评论在我的答案中添加更多细节

您的调用传递的似乎是一个字符串和一个单元格列表 字符串很好,但是在您的函数中,您遍历列表并尝试将单元类的每个实例与正确传递的字符串进行比较,这就是您的问题。

希望这会有所帮助(而且我没有误读代码!)

还有更多细节 -

这是问题的症结所在,当您创建feature_listepic_list 时,您以两种不同的方式进行操作,第一种是将单元格附加到列表中,第二种是附加一个值。但是,您在两种类型上都使用相同的 check_link 函数。所以要么你需要扩展你的check_link函数来处理这两种类型,要么你需要保持一致并选择一个。

【讨论】:

  • 非常感谢您的回复。实际上,我在调用函数 check_link(issue_table.cell(i, 10).value, epic_list) 时使用了 .value。我也再次添加.value,它返回“AttributeError:'unicode'对象没有属性'value'”
  • 不,你在错误的地方使用了 .value,你需要将它添加到你正在迭代的列表中的元素,而不是你正在寻找的值
  • 我根据你的回答编辑了代码,但是,它返回 AttributeError: 'unicode' object has no attribute 'value' ...
  • 您能否添加一个小样本来说明您的数据是什么样的?我创建了一组简单的 2 个 xls 文件并在上面运行您的代码,它似乎可以工作(至少它没有抛出任何错误)
  • 我收回了这一点 - 在玩弄了一点数据之后,我能够复制异常,一旦我添加了一个 .value,因为我输入了我的初始答案,它就起作用了(好吧,我有在这里玩更多的数据,但是......)。无论如何,如果您可以在 SO 上获得一组样本表,我将很乐意再看一次,但如果您不能(无论出于何种原因),我认为我无能为力。祝你好运!
猜你喜欢
  • 1970-01-01
  • 2021-03-28
  • 2015-02-01
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多