Как загрузить в Python xlsx, который изначально был.файл расширение XLS?
я использую xlrd
для процесса .файлы xls и openpyxl
для процесса .xlsx файлы, и это работает хорошо.
затем мне вручают то, что якобы a .xls файл, поэтому я стараюсь xlrd.open_workbook()
и получаем:
XLRDError: Unsupported format, or corrupt file: Expected BOF record; found '<?xml ve'
я смотрю на этой вопрос, и я предполагаю, что мой файл, хотя и заканчивается расширением .xls, должно быть, на самом деле .файлы XLSX. И действительно, я могу просмотреть его в текстовом редакторе:
<?xml version="1.0" encoding="UTF-8"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
:
:
:
(по соображениям конфиденциальности, я не могу постить весь файл, но это, вероятно, не требуется для нашего анализа).
поэтому я предполагаю, что если я просто скопирую (cp
) его .xlsx, я должен быть в состоянии открыть его с openpyxl.load_workbook()
, но я получаю:
BadZipfile: File is not a zip file
если это на самом деле xls (маловероятно), но не может быть открыт с xlrd
, и если это atcually xlsx, но не может быть открыт с openpyxl
, даже после того, как я cp
это к a .xlsx, что делать?
Примечание: Если я открою .xls в Excel, сохраните его как .xlsx, и повторите попытку с openpyxl
, он загружается нормально, но этот ручной шаг не является роскошью, которую я буду иметь при выполнении моей программы.
3 ответов
ясно одно: файл, который вы пытаетесь открыть, имеет другой формат, чем предполагает его расширение.
как вы уже знаете, форматы файлов Excel включают (но не ограничиваются) xls
и xlsx
.
формат Excel 2003 (
xls
) - это двоичный формат. Это означает, что если вы открываетеxls
файл с текстовым редактором, вы просто увидите тарабарщину.формат Excel 2007 (
xlsx
) вполне отличающийся. Аxlsx
файл представляет собой zip-файл с кучей XML-файлов внутри. Вы можете использовать архиватор zip для извлечения содержимого . Затем вы можете редактировать XML-файлы с помощью любого текстового редактора. Однако, открывxlsx
файл непосредственно с текстовым редактором похож на открытиеzip
файл с текстовым редактором: вы просто увидите тарабарщину.
то, что ты can откройте файл с помощью текстового редактора (и прочитайте его содержимое) показывает, что это ни или . Ваш файл не является ни двоичным файлом, ни zip-файлом, это простые XML-файл.
кроме того, это сообщение об ошибке говорит о многом.
BadZipfile: File is not a zip file
это означает, что openpyxl
пытается открыть файл как и поэтому . Но когда он пытается извлечь из него содержимое, он терпит неудачу, потому что ваш файл не zip-файл.
но если файл не является ни или xls
файл, как Microsoft Excel может прочитать его? Я подумал, что слишком. После некоторых исследований я считаю, что в вашем файле есть XML Spreadsheet 2003 формат файла. выглядит очень похоже на содержимое файла, который вы опубликовали. Поскольку Microsoft Excel поддерживает этот формат, неудивительно, что она может читать файл.
к сожалению, библиотеки Python, такие как xlrd
и openpyxl
только и xlsx
форматы файлов, поэтому они не смогут прочитать ваш файл. Я думаю, вам просто нужно вручную преобразовать его в поддерживаемый формат.
Я не на OSX, поэтому это не тестируется. Вы можете использовать appscript
пакет, несмотря на отсутствие поддержки, чтобы открыть файл-нарушитель и повторно сохранить его.
from appscript import *
excel = app('Microsoft Excel')
wb = excel.open('/path/to/file.xls')
wb.save_as('/path/to/fileout.xlsx', file_format=k.XLSX_file_format)
#not sure the exact name of k.excel_file
У меня была похожая проблема. Оказалось, что ему нужен абсолютный путь к файлу. Е. Г., "c:/dir/filename.xlsx "вместо" filename.XLSX-файл". Относительные пути работали на osx, но не на Windows.