4

我遇到了一个非常奇怪的问题。我正在尝试从 excel 文件中读取一些数据,但该属性nrows的值错误。虽然我的文件有很多行,但它只返回 2。

我在 pydev eclipse 中工作。我不知道实际上是什么问题;一切看起来都很好。

当我尝试手动通过索引访问其他行时,但出现索引错误。

我很感激任何帮助。

如果有帮助,这是我的代码:

def get_data_form_excel(address):
    wb = xlrd.open_workbook(address)
    profile_data_list = []
    for s in wb.sheets():
        for row in range(s.nrows):
            if row > 0:
                values = []
                for column in range(s.ncols):
                    values.append(str(s.cell(row, column).value))
                profile_data_list.append(values)
    print str(profile_data_list)
    return profile_data_list
4

4 回答 4

1

为确保您的文件没有损坏,请尝试使用另一个文件;我怀疑 xlrd 有问题。

另外,我已经清理了您的代码以使其看起来更好。例如,if row > 0不需要检查,因为您可以首先迭代range(1, sheet.nrows)

def get_data_form_excel(address):
    # this returns a generator not a list; you can iterate over it as normal,
    # but if you need a list, convert the return value to one using list()
    for sheet in xlrd.open_workbook(address).sheets():
        for row in range(1, sheet.nrows):
            yield [str(sheet.cell(row, col).value) for col in range(sheet.ncols)]

或者

def get_data_form_excel(address):
    # you can make this function also use a (lazily evaluated) generator instead
    # of a list by changing the brackets to normal parentheses.
    return [
        [str(sheet.cell(row, col).value) for col in range(sheet.ncols)]
        for sheet in xlrd.open_workbook(address).sheets()
        for row in range(1, sheet.nrows)
    ]
于 2013-10-01T12:17:57.250 回答
0

在尝试了一些其他文件之后,我确定它与该文件有关,并且我认为它与 Microsoft 2003 和 2007 的差异有关。

于 2013-10-01T13:29:59.147 回答
0

我最近也遇到了这个问题。我正在尝试读取一个 excel 文件,并且 xlrd.nrows 给出的行号小于实际的行号。正如 Zeinab Abbasi 所说,我尝试了其他文件,但效果很好。

最后,我发现了不同之处:在失败的文件中嵌入了一个基于 VB 脚本的按钮,用于下载记录并将记录附加到当前工作表。

然后,我尝试将文件转换为 .xlsx 格式,但它要求我另存为启用宏的另一种格式,例如 .xlsm。这次 xlrd.nrows 给出了正确的值。

于 2015-01-17T05:43:54.633 回答
0

您的 excel 文件是否使用外部数据?我只是遇到了同样的问题并找到了解决方法。我正在使用 excel 从谷歌表格中获取信息,我想让 python 向我展示这些数据。因此,对我来说,解决方法是转到数据>连接(在“获取外部数据”中)>属性并取消选中“在保存工作簿之前从外部数据范围中删除数据”

于 2016-09-21T15:30:47.660 回答