Python xlrd неподдерживаемый формат или поврежденный файл.

Мой код:

import xlrd
wb = xlrd.open_workbook("Z:\\Data\\Locates\\3.8 locates.xls")
sh = wb.sheet_by_index(0)
print sh.cell(0,0).value

Ошибка:

Traceback (most recent call last):
File "Z:\Wilson\tradedStockStatus.py", line 18, in <module>
wb = xlrd.open_workbook("Z:\\Data\\Locates\\3.8 locates.xls")
File "C:\Python27\lib\site-packages\xlrd\__init__.py", line 429, in open_workbook
biff_version = bk.getbof(XL_WORKBOOK_GLOBALS)
File "C:\Python27\lib\site-packages\xlrd\__init__.py", line 1545, in getbof
bof_error('Expected BOF record; found %r' % self.mem[savpos:savpos+8])
File "C:\Python27\lib\site-packages\xlrd\__init__.py", line 1539, in bof_error
raise XLRDError('Unsupported format, or corrupt file: ' + msg)
xlrd.biffh.XLRDError: Unsupported format, or corrupt file: Expected BOF record;
found '<table r'"

Файл, похоже, не поврежден или не имеет другого формата. Все, что поможет найти источник проблемы, было бы здорово.

Ответы

Ответ 1

Вы говорите:

Файл не выглядит поврежденным или отличается от другого.

Однако, как говорится в сообщении об ошибке, первые 8 байтов файла '<table r'... это определенно не формат Excel .xls. Откройте его с помощью текстового редактора (например, "Блокнот" ), который не будет обращать внимания на (неправильное) расширение .xls и сам убедиться.

Ответ 2

У меня была аналогичная проблема, и она была связана с версией. В терминале python проверьте:

>> import xlrd
>> xlrd.__VERSION__

Если у вас '0.9.0', вы можете открыть почти все файлы. Если у вас есть '0.6.0', что я нашел на Ubuntu, у вас могут возникнуть проблемы с новейшими файлами Excel. Вы можете загрузить последнюю версию xlrd, используя стандарт Distutils.

Ответ 3

Это произойдет с некоторыми файлами, а также в Excel.

Ответ 4

Попробуйте открыть его с помощью pandas:

import pandas as pd
data=pd.read_html(filename.xls)

Или попробуйте любой другой синтаксический анализатор html python.

Это не правильный файл excel, а html, читаемый с помощью excel.

Ответ 5

Я нашел подобную проблему при загрузке файла .xls и открыл ее с помощью библиотеки xlrd. Затем я опробовал решение конвертации .xls в .xlsx, как описано здесь: как конвертировать xls в xlsx

Он работает как шарм и вместо открытия .xls, теперь я работаю с файлом .xlsx, используя библиотеку openpyxl.

Надеюсь, что это поможет решить вашу проблему.

Ответ 6

Я только что загрузил xlrd, создал документ excel (excel 2007) для тестирования и получил ту же ошибку (сообщение говорит "найдено PK\x03\x04\x14\x00\x06\x00 '). Расширение - xlsx. Попробовал сохранить его в более раннем формате .xls и ошибка исчезла.....

Ответ 7

В моем случае, после открытия файла текстовым редактором в качестве предлагаемого @john-machin, я понял, что файл не зашифрован, как предполагается, файл Excel, но он в формате CSV и был сохранен в виде файла Excel. То, что я сделал, было переименовано в файл и его расширение и вместо этого использовало функцию read_csv:

os.rename('sample_file.xls', 'sample_file.csv')
csv = pd.read_csv("sample_file.csv", error_bad_lines=False)

Ответ 8

Я встречаю ту же проблему.

он лежит в самом файле .xls - он выглядит как файл Excel, но это не так. (см. всплывающее окно, когда вы открыто открываете .xls из Excel)

sjmachin прокомментировал 19 января 2013 г. из https://github.com/python-excel/xlrd/issues/26.

Ответ 9

Я тоже встретил эту проблему. Я открыл этот файл excel и сохранил его как другие форматы, такие как excel 97-2003, и, наконец, я решил эту проблему.

Ответ 10

Нет ничего плохого в вашем файле. xlrd пока не поддерживает файлы xlsx (excel 2007+), хотя он якобы поддерживал это в течение некоторого времени.

Simplistix github

2 дня назад они перенесли альфа-версию своих git, которая интегрирует поддержку xlsx. Другие форумы предлагают использовать парсер DOM для файлов xlsx, так как тип файла xlsx - это просто zip-архив, содержащий XML. Я этого не пробовал. есть еще один пакет с аналогичной функциональностью, такой как xlrd, и это называется openpyxl, который вы можете получить из easy_install или pip. Я тоже этого не пробовал, однако его API должен быть похож на xlrd.