Python xlrd: неверный формат или повреждённый файл
Я столкнулся с проблемой при работе с файлом Excel в 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"'
Файл, кажется, не повреждён и не имеет другого формата. Любая помощь в поиске источника проблемы будет очень полезна. Возможно, я пропустил что-то важное или использую неправильный способ чтения файла?
5 ответ(ов)
Попробуйте открыть файл как HTML с помощью pandas:
import pandas as pd
data = pd.read_html('filename.xls')
Или воспользуйтесь любым другим HTML парсером для Python.
Судя по всему, это не настоящий файл Excel, а HTML, который может быть прочитан в Excel.
Вы говорите:
Файл, похоже, не поврежден и не имеет другого формата.
Тем не менее, как указывает сообщение об ошибке, первые 8 байтов файла - это '<table r'
... это определенно не формат Excel .xls
. Откройте файл в текстовом редакторе (например, в Блокноте), который не обратит внимания на (неправильное) расширение .xls
, и убедитесь сами.
Это может произойти с некоторыми файлами, когда они также открыты в Excel.
У меня была похожая проблема, и она была связана с версией. В терминале Python проверьте:
>> import xlrd
>> xlrd.__VERSION__
Если у вас версия '0.9.0', вы сможете открывать почти все файлы. Если у вас версия '0.6.0', как это было у меня на Ubuntu, могут возникнуть проблемы с новыми файлами Excel. Вы можете скачать последнюю версию xlrd с помощью стандартного инструмента Distutils.
Я столкнулся с такой же ошибкой xlrd.biffh.XLRDError: Unsupported format, or corrupt file: Expected BOF record;
и решил её, написав конвертер из XML в XLSX. Дело в том, что библиотека xlrd не поддерживает файлы в формате XML Spreadsheet (*.xml), то есть файлы не являются ни XLS, ни XLSX.
Ниже приведён код, который демонстрирует, как можно осуществить такую конвертацию с использованием pandas
и BeautifulSoup
:
import pandas as pd
from bs4 import BeautifulSoup
def convert_to_xlsx():
with open('sample.xml') as xml_file: # Замените 'sample.xls' на 'sample.xml'
soup = BeautifulSoup(xml_file.read(), 'xml')
writer = pd.ExcelWriter('sample.xlsx')
for sheet in soup.findAll('Worksheet'):
sheet_as_list = []
for row in sheet.findAll('Row'):
sheet_as_list.append([cell.Data.text if cell.Data else '' for cell in row.findAll('Cell')])
pd.DataFrame(sheet_as_list).to_excel(writer, sheet_name=sheet.attrs['ss:Name'], index=False, header=False)
writer.save()
Учтите, что в функции open()
необходимо указать правильное расширение файла (в данном случае, sample.xml
). Этот код считывает XML-формат, извлекает данные из каждого листа и сохраняет их в формате XLSX, который уже поддерживается библиотеками, такими как pandas
.
Как изменить порядок столбцов в DataFrame?
'pip' не распознан как командa внутреннего или внешнего формата
Почему statistics.mean() работает так медленно?
Преобразование строки даты JSON в datetime в Python
Есть ли разница между поднятием экземпляра класса Exception и самого класса Exception?