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'"

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


person wDroter    schedule 08.03.2012    source источник
comment
1. Попробуйте изменить имя файла (уберите цифры и пробелы в начале) 2. Защищен ли файл паролем?   -  person user850498    schedule 08.03.2012
comment
Я попытался изменить имя файла с тем же результатом, и файл не защищен паролем.   -  person wDroter    schedule 09.03.2012


Ответы (16)


Ты говоришь:

Файл не поврежден и не имеет другого формата.

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

person John Machin    schedule 09.03.2012
comment
Точно так же, если я получаю (и получаю) аналогичную ошибку, но с XLRDError: Неподдерживаемый формат или поврежденный файл: Ожидается запись BOF; нашел '‹?xml ve', это означало бы, что мой xls действительно является xlsx? - person Pyderman; 03.07.2015
comment
@Pyderman нет, это не файл xlsx. Можно было сохранить как электронную таблицу XML (*.xml) (не поддерживается xlrd) - person John Machin; 11.01.2017
comment
спасибо - я изменил свой файл с .csv на .xls, и мой код заработал. - person Nidhin_toms; 19.12.2018

Попробуйте открыть его как HTML с пандами:

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

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

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

person foebu    schedule 13.07.2014
comment
Привет, откройте свой xls в текстовом редакторе и посмотрите, является ли он html. Если вы получаете ошибку в первом топе, это html. Тогда я не понимаю, почему, если вы попытаетесь использовать read_html, вы не получите никаких таблиц. - person foebu; 22.07.2014
comment
Это решение для меня! Спасибо! - person user2552108; 28.02.2021

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

person user1479095    schedule 26.06.2013
comment
Я получил это сообщение об ошибке, и это действительно было потому, что я открыл файл во время выполнения кода. Спасибо. - person Boosted_d16; 02.01.2020
comment
Да, вы правы! В моем случае расширение файла xls, но содержимое в файле на самом деле HTML... - person aof; 02.09.2020
comment
Это была и моя проблема - person Dan Safee; 14.09.2020
comment
Это была именно моя проблема! Еще одно напоминание о том, почему я стараюсь придерживаться простого CSV или ODS в худшем случае. - person EA304GT; 08.05.2021

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

>> import xlrd
>> xlrd.__VERSION__

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

person Silveira Neto    schedule 15.03.2013
comment
могут быть проблемы, это неточно. xlrd 0.6.0 вообще не обрабатывает файлы xlsx. 0.6.0 — неподдерживаемый антиквариат. - person John Machin; 16.03.2013

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

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

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

person Ira Noviani    schedule 05.01.2016
comment
извините, это не помогло, потому что ошибка "xlrd.open_workbook" и любой конвертер не мог помочь, пока не возникнет ошибка - person Konstantin Kozlenko; 31.07.2018

Я столкнулся с той же ошибкой xlrd.biffh.XLRDError: Unsupported format, or corrupt file: Expected BOF record; и решил ее, написав конвертер XML в XLSX. Причина в том, что на самом деле xlrd не поддерживает электронные таблицы XML (*.xml), т.е. НЕ в формате XLS или XLSX.


import pandas as pd
from bs4 import BeautifulSoup

def convert_to_xlsx():
    with open('sample.xls') as xml_file:
        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()

person melikesahin    schedule 21.07.2020
comment
Это просто дало пустой файл .xlsx - person user2552108; 28.02.2021

В моем случае, после открытия файла в текстовом редакторе, как предложил @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)
person ambodi    schedule 09.07.2015

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

person TruelyBob    schedule 04.08.2016

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

person userrenren    schedule 18.03.2012

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

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

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

person Mark K    schedule 23.07.2015

Я была такая же проблема. Эти старые файлы отформатированы как файл с разделителями табуляции. Я смог открыть свои проблемные файлы с помощью read_table; то есть df = pd.read_table('trouble_maker.xls').

person mbauer    schedule 01.03.2018

Работал над той же проблемой, наконец, сделал это, это главное для вопроса, поэтому просто поместил то, что я сделал.

Наблюдение - 1 - На самом деле файл не был XLS, я переименовал его в txt и заметил в файле текст HTML.

2 - Переименовал файл в html и попытался прочитать pd.read_html, не удалось.

3- Добавлено, поскольку его не было в текстовом файле, удален стиль, чтобы таблица отображалась в браузере локально, и РАБОТАЕТ.

Ниже приведен код, который может кому-то помочь.

import pandas as pd
import os
import shutil
import html5lib
import requests
from bs4 import BeautifulSoup
import re
import time

shutil.copy('your.xls','file.html')
shutil.copy('file.html','file.txt')
time.sleep(2)

txt = open('file.txt','r').read()

# Modify the text to ensure the data display in html page, delete style

txt = str(txt).replace('<style> .text { mso-number-format:\@; } </script>','')

# Add head and body if it is not there in HTML text

txt_with_head = '<html><head></head><body>'+txt+'</body></html>'

# Save the file as HTML

html_file = open('output.html','w')
html_file.write(txt_with_head)

# Use beautiful soup to read

url = r"C:\Users\hitesh kumar\PycharmProjects\OEM ML\output.html"
page = open(url)
soup = BeautifulSoup(page.read(), features="lxml")
my_table = soup.find("table",attrs={'border': '1'})

frame = pd.read_html(str(my_table))[0]
print(frame.head())
frame.to_excel('testoutput.xlsx',sheet_name='sheet1', index=False)
person Hietsh Kumar    schedule 25.01.2020

Иногда помогает добавление ?raw=true в конце пути к файлу. Например:

wb = xlrd.open_workbook("Z:\\Data\\Locates\\3.8 locates.xls?raw=true")
person Эрн Ист    schedule 28.07.2020

Откройте в Google Sheets, а затем загрузите из листов в формате CSV, а затем повторно загрузите на диск. Затем вы можете открыть файл CSV из python.

person PRATEEK    schedule 29.10.2020
comment
вы можете добавить несколько ссылок на ссылки - person YLS; 29.10.2020

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

Simplistix github

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

person GE420    schedule 15.04.2012
comment
-1 (1) Его файл начинается с '<table r'. Это НЕ файл XLSX; ZIP-архив начинается с 'PK' (2) другие форумы предлагают вещи, которые они не пробовали или работают только с крошечными файлами и/только в их собственном упрощенном приложении (3) openpyxl - это порт пакета PHP, и его API можно только предположить быть похожим на xlrd кем-то, кто дико угадывал. - person John Machin; 16.04.2012
comment
спасибо за xlrd и поддержку xlsx, Джон! xlrd - ИМХО лучший модуль Python для обработки файлов Excel. Если я могу помочь поддержать вашу работу деньгами или иным образом, пожалуйста, дайте мне знать, как... - person GE420; 21.11.2012

Я знаю, что должен быть правильный способ решить эту проблему, но просто для экономии времени

Я загрузил свой лист xlsx в Google Таблицы, а затем снова загрузил его из Google Таблиц, теперь он работает.

Если у вас нет времени, чтобы решить проблему, вы можете попробовать это

person sparsh    schedule 15.01.2020
comment
Пожалуйста, ознакомьтесь с ответами, уже данными на этот вопрос, прежде чем добавлять новый, особенно если уже есть принятое решение. - person FredrikHedman; 15.01.2020