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

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

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

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

1
djmac 20 Фев 2020 в 07:08

2 ответа

Лучший ответ

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

1
born_naked 20 Фев 2020 в 05:54

Рабочие листы Excel обычно имеют много форматирования, и все они должны использоваться и интерпретироваться при открытии файла Excel. Можете ли вы разобрать конкретные листы, которые вам нужны? Вы знаете их заранее? Если это так, вы можете разбить несколько файлов 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
0
ASH 11 Мар 2020 в 15:12