Как открыть Excel файл в памяти и читать листы в цикле, не переоткрывая файл на каждой итерации в цикле?

Есть задача, в цикле for собирать данные с листов определенных столбцов (одинаковых) Excel файла, но возникла проблема на больших файлах. Если файл "тяжёлый" то открытие файла и чтение данных с определенного листа на каждой итерации цикла занимает примерно 30 секунд. Это слишком много, и я решил открыть файл в памяти через open и обращаться как бы к открытому файлу в памяти. На тяжелый файлах это дало прирост скорости:

  • обработка вкладок без open - 299 сек
  • обработка вкладок с open - 267 сек

Вопрос, правильно ли я обращаюсь к открытому файлу в памяти через open?

Я ожидал прирост в скорости обработки хотя бы в 2 раза. Как я был наивен.

file_excel_path = filedialog.askopenfilename(initialdir=path.dirname(__file__),
                                                 filetypes=(("Excel 2007", "*.xlsx"),
                                                            ("Excel 97", "*.xls"),
                                                            ("all files", "*.*")))
excel_in_memory = open(file_excel_path, 'rb')

for i in list_active_sheets:
     df = pd.read_excel(excel_in_memory,
                        sheet_name=i,
                        usecols=(3,11),
                        encoding='utf8')
     print(df)

excel_in_memory.close()

Ответы (1 шт):

Автор решения: MaxU

Можно воспользоваться pandas.ExcelFile.parse:

ef = pd.ExcelFile(filename)
for sheet_name in ef.sheet_names:
    df = ef.parse(sheet_name=sheet_name, usecols=[3, 11], encoding='utf8')
    ...

PS также стоит сравнить скорость работы pd.ExcelFile() и ef.parse() для раличных Excel движков, указав параметр pd.ExcelFile(filename, engine="...").

Поддерживаемые движки: None, xlrd, openpyxl, pyxlsb

→ Ссылка