pandas ExcelFile анализирует все листы при инициализации? (и можно ли этого избежать) - PullRequest
1 голос
/ 20 февраля 2020

У меня есть серия больших (и плохо отформатированных) таблиц Excel, которые я пытаюсь обработать с помощью pandas. Каждый файл Excel содержит 50-60 листов, и меня интересует только подмножество листов в каждом файле.

Я попытался прочитать всю электронную таблицу как объект pd.ExcelFile, поэтому я могу использовать атрибут sheet_names для разбора отдельных листов (и я не знаю имен каждого листа заранее) , Это работает - но кажется исключительно медленным (около минуты для каждого файла ~ 30 МБ excel).

Я могу только предположить, что это происходит потому, что каждый лист анализируется при инициализации объекта pd.ExcelFile (... может быть неправильно?). Если да, есть ли способ предотвратить такое поведение? - Я действительно хочу получить только имена листов, а затем проанализировать указанные листы c.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 20 февраля 2020
Насколько мне известно,

pandas использует xlrd или аналогичный движок для открытия и анализа файла excel. xlrd - это движок по умолчанию . Когда вы открываете файл Excel с помощью xlrd, по умолчанию загружаются все листы. Таким образом pandas предположительно делает то же самое. Возможно, вам повезет больше, открыв файлы Excel с помощью xlrd, установив on_demand kwarg в True, а затем определив df после извлечения данных с использованием xlrd.

0 голосов
/ 11 марта 2020

Рабочие листы Excel обычно имеют множество форматов, и все они должны использоваться и интерпретироваться при открытии файла Excel. Можете ли вы разобрать нужные вам c листы? Вы знаете их заранее? Если это так, вы можете разбить несколько файлов Excel, каждый с несколькими листами, на отдельные файлы и сосредоточиться только на этих объектах. Попробуйте приведенный ниже код и посмотрите, поможет ли он вам добраться туда, куда вам нужно.

import os
import xlrd
from xlutils.copy import copy
import xlwt

path = 'C:\\path_to_Multiple_Excel_Files\\'
targetdir = ('C:\\path_to_out_files\\') #where you want your new files

if not os.path.exists(targetdir): #makes your new directory
    os.makedirs(targetdir)

for root,dir,files in os.walk(path, topdown=False): #all the files you want to split
    xlsfiles=[f for f in files] #can add selection condition here

for f in xlsfiles:
    wb = xlrd.open_workbook(os.path.join(root, f), on_demand=True)
    for sheet in wb.sheets(): #cycles through each sheet in each workbook
        newwb = copy(wb) #makes a temp copy of that book
        newwb._Workbook__worksheets = [ worksheet for worksheet in newwb._Workbook__worksheets if worksheet.name == sheet.name ]
        #brute force, but strips away all other sheets apart from the sheet being looked at
        newwb.save(targetdir + f.strip(".xls") + sheet.name + ".xls") 
        #saves each sheet as the original file name plus the sheet name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...