Как открыть 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 шт):
Можно воспользоваться 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