读取excel时带有pandas的AssertionError

时间:2016-05-27 14:53:48

标签: python excel pandas xlsx xlrd

我正在尝试使用pandas将xlsx文件读入python 我之前已经完成了数千次,但有些原因是它没有使用特定文件。

该文件是从另一个源下载的,当我用pandas阅读时,我得到一个AssertionError(见结尾):

df = pandas.read_excel(pathtomyfile, sheetname = "Sheet1")

为路径定义变量。路径存在(os.path.exists(path)返回True)。

当我复制文件的内容并将值粘贴到新的Excel文档中时,将使用read_excel()方法打开这个新文件。

当我复制文件的内容并将格式粘贴到新的Excel中时, 这个新的将使用read_excel()方法打开。

它似乎不是值或格式。

我猜这可能是一个编码问题? 谢谢你的帮助。

    df1 = pandas.read_excel(snap1)
File "C:\Python\python-3.4.4.amd64\lib\site-packages\pandas\io\excel.py", line 163, in read_excel
    io = ExcelFile(io, engine=engine)
File "C:\Python\python-3.4.4.amd64\lib\site-packages\pandas\io\excel.py", line 206, in __init__
    self.book = xlrd.open_workbook(io)
File "C:\Python\python-3.4.4.amd64\lib\site-packages\xlrd\__init__.py", line 422, in open_workbook
    ragged_rows=ragged_rows,
File "C:\Python\python-3.4.4.amd64\lib\site-packages\xlrd\xlsx.py", line 794, in open_workbook_2007_xml
    x12sheet.process_stream(zflo, heading)
File "C:\Python\python-3.4.4.amd64\lib\site-packages\xlrd\xlsx.py", line 531, in own_process_stream
    self_do_row(elem)
File "C:\Python\python-3.4.4.amd64\lib\site-packages\xlrd\xlsx.py", line 597, in do_row
    assert 0 <= self.rowx < X12_MAX_ROWS
AssertionError

6 个答案:

答案 0 :(得分:0)

为了完整起见,我有一个类似的问题,第一行的行号不正确,我修改了我的问题,改变了xlsx文件,代码改编自this answer

def repair_broken_excelfile(zipfname, *filenames, new_name=None):
    # https://stackoverflow.com/a/4653863/1562285
    import tempfile
    import zipfile
    import shutil
    import os
    tempdir = tempfile.mkdtemp()
    try:
        tempname = os.path.join(tempdir, 'new.zip')
        with zipfile.ZipFile(zipfname, 'r') as zipread:
            with zipfile.ZipFile(tempname, 'w') as zipwrite:
                for item in zipread.infolist():
                    print('fn: ' + item.filename)
                    if item.filename not in filenames:
                        data = zipread.read(item.filename)

                        zipwrite.writestr(item, data)
                    else:

                        data = zipread.read(item.filename)
                        data = data.replace(b'<row r="0" spans="">', b'<row r="1" spans="">')
                        zipwrite.writestr(item, data)
                        pass
        if not new_name:
            new_name = zipfname
        shutil.move(tempname, new_name)
    finally:
        shutil.rmtree(tempdir)

显然xlrd中有一个修复underway

答案 1 :(得分:0)

在我的情况下,我使用xlrd包读取excel,但遇到了相同的Assertion错误。 从站点程序包和打开的sheet.py(https://github.com/python-excel/xlrd/blob/master/xlrd/sheet.py

中打开xlrd程序包

在sheet.py中找到此代码

    if self.biff_version >= 80:
        self.utter_max_rows = 65536
    else:
        self.utter_max_rows = 16384

将以上内容转换为...

 #if self.biff_version >= 80:
 self.utter_max_rows = 65536
 #else:
 #      self.utter_max_rows = 16384

现在尝试运行您的程序... 问题将解决..:)

答案 2 :(得分:0)

遇到相同的问题,我在窗口上以xml格式保存文件:“另存为类型:XML Spreadsheet 2003”。然后,我打开文件并另存为xlsx格式。新文件不再显示错误消息。

答案 3 :(得分:0)

文件中包含韩文字符。这些需要替代编码。 在read_excel()方法中使用“ encoding”参数可以解决该问题。

df = pandas.read_excel(路径文件,工作表名称为“ Sheet1”,编码为“ utf-16”)

答案 4 :(得分:0)

有时候,只需在Excel中删除表格下方的(空白)行即可解决此问题。

答案 5 :(得分:0)

在系统中查找文件xlsx.py。

在您的计算机上,它显然位于C:\ Python \ python-3.4.4.amd64 \ lib \ site-packages \ xlrd \ xlsx.py

搜索该行:

X12_MAX_ROWS = 2 ** 20

并将其更改为类似

X12_MAX_ROWS = 2 ** 22

这会将行数限制从100万行增加到400万行。