Можно ли загрузить xlsx с помощью openpyxl из zipfile

Я пытаюсь openpyxl.load_workbook xlsx файлы из сжатого zip-файла, но он не работает. Следующий код не работает в openpyxl.load_workbook с «BadZipfile: File не является zip-файлом»

with zipfile.ZipFile(os.path.join(root, raw)) as z: for file_info in z.infolist(): wb = openpyxl.load_workbook(z.open(file_info), read_only=True) 

В архиве и файле excel нет ничего плохого, как если бы я извлек его на диск, то работает следующее:

 with open('report.xlsx') as f: wb = openpyxl.load_workbook(f, read_only=True) 

Я могу пойти с этим решением и временно извлечь его где-нибудь и загрузить xslx, но хотел бы понять, можно ли загрузить его из zipfile.

Проблема в том, что readonly=True не делает то, что вы думаете. Согласно документам :

К счастью, есть два режима, которые позволяют вам читать и записывать неограниченное количество данных с (близким) постоянным потреблением памяти.

Хотя явным образом не указано, я бы предположил, что это включает в себя некоторый эквивалент файла с отображением памяти (из-за «постоянного потребления памяти») и произвольного доступа (из-за диапазона разрешенных операций).

В любом случае, установка readonly=True не указывает на то, что вы только собираетесь читать книгу (это все, load_workbook может сделать load_workbook , вам нужно перезаписать существующий, чтобы внести какие-либо «изменения»). Это указывает на то, что вы хотите получить доступ к файлу непосредственно на диске, не загружая все содержимое.

Кажется довольно ясным (и интуитивно ожидаемым), что ZipFile.open не предоставляет файл с произвольным доступом:

Примечание . Файл-подобный объект __iter__() только для чтения и предоставляет следующие методы: read() , readline() , readlines() , __iter__() , next() .

Тот факт, что seek не упоминается в этом списке, довольно говорит (каламбур только несколько предназначен).

Вы можете получить дополнительную информацию об исключении, разделив строку нарушения на две (полезная общая технология отладки для вложенных вызовов функций):

 x = z.open(file_info) wb = openpyxl.load_workbook(x, readonly=True) 

Вы заметите, что ошибка возникает во второй из этих двух строк. Это связано с тем, что практически все форматы открытых документов Microsoft на самом деле являются просто причудливыми zip-файлами. Проблема в том, что openpyxl не может открыть ваш файл в режиме произвольного доступа, а не в том, что он фактически является недопустимым zip-файлом.

В любом случае, это куча очень образованных догадок, которые приводят к простому решению с одним ключевым словом:

TL; DR

Избавиться от readonly=True при чтении данных неслучайного доступа, таких как сжатая запись в zip:

 wb = openpyxl.load_workbook(z.open(file_info)) 

аппендикс

Вы должны привыкнуть писать минимальные программы, которые демонстрируют вашу проблему, чтобы люди, отвечающие на ваш вопрос, могли сосредоточиться на выполнении своей работы, а не на раздражении и закрытии того, что в противном случае было бы очень хорошим вопросом. Мне понравился ваш вопрос, чтобы сделать это для вас, так что вот минимальная программа, которая демонстрирует вашу проблему, и требует всего лишь копирования и вставки для запуска:

 import openpyxl, zipfile from openpyxl.workbook.workbook import Workbook wb = Workbook() wb.active['A1'] = 12 wb.active['A2'] = 13 wb.save('report.xlsx') with zipfile.ZipFile('test.zip', 'w') as z: z.write('report.xlsx') with open('report.xlsx') as f: wb = openpyxl.load_workbook(f, read_only=True) print(wb.active['A1'].value) print(wb.active['A2'].value) with zipfile.ZipFile('test.zip', 'r') as z: for file_info in z.infolist(): x = z.open(file_info, 'r') wb = openpyxl.load_workbook(x, readonly=True) print(wb.active['A1'].value) print(wb.active['A2'].value) 
  • как объединить многострочный заголовок блока данных pandas в один заголовок ячейки?
  • Проблема Добавление значений, выведенных из нескольких таблиц excel в массив
  • Запись списка Python в строки Excel с помощью xlwt
  • RunFrozenPython в xlwings жалуется на Workbook.caller () в Python
  • Чтение файлов Excel в Python через сетевой ресурс происходит очень медленно
  • IOError: неверный режим ('rb') с использованием pandas.read_excel
  • Как избежать перезаписи ячейки в excel с помощью python?
  • Xlwings - привязка сохраненного диапазона и добавление дополнительных значений
  • Как вставлять и добавлять элементы в поле со списком в Excel через Python?
  • удаление данных из двух XLXS-ячеек в csv
  • конвертировать входной поток excel в json в python
  • Давайте будем гением компьютера.