Как загрузить в 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.