Ускорение чтения большой таблицы в pandas

Передо мной стоит такая задача. Есть очень-очень большая excel-таблица. Нужно принять от пользователя имена столбцов и сохранить ему таблицу, содержащую только эти столбцы в новый файл. Проблема в том, что pandas.read_excel и pandas.to_excel жутко медленныe.

На англоязычном стаке нашел такое решение: из кода вызывать утилиту ssconvert, которая довольно быстро преобразует *.xlsx-файл к *.csv-файлу. Внутри кода читать и сохранять csv-файл, а потом той же утилитой преобразовать его обратно. Все чудесно работало, но, увы, только на линуксе. Программа должна работать на винде, но никаких аналагов ssconvert я не нашел (кроме vbs-скрипта, который использует Excel, чтобы переконвертировать файл, но это тоже очень медленно).

В связи с этим вопрос: как ускорить открытие файла? Возможно стоит отказаться от идеи с конвертированием, но разумных замен я ей пока не вижу. Спасибо.

Привожу наброски кода:

import os
import pandas as pd


def save_table(df: pd.DataFrame, save_name: str):
    print("\nНачинаю сохранение файла...")
    df.to_excel(save_name)


def get_input_data():
    print("Введите имя входного файла")
    filename = input()

    while not os.path.isfile(filename) or os.path.splitext(filename)[-1] not in ['.xlsx', '.xls']:
        print("\nТакого файла не существует или это не эксель-таблица.\n"
              "Пожалуйста, введите корректное имя файла\n")

        filename = input()

    cols_to_use = set()

    print("Введите имена столбцов через enter (один столбец -- одна строка)")
    print("Введите -1, чтобы закончить ввод столбцов\n")

    while (col_name := input()) != "-1":
        col_name = col_name.strip()
        cols_to_use.add(col_name)

    print("Введите имя файла для сохранения новой таблицы\n")
    name_to_save = input()

    while not name_to_save:
        print("Нельзя задать пустое имя файла, попробуйте еще раз\n")
        name_to_save = input()

    print("Начинаю чтение файла...")
    df = pd.read_excel(filename, usecols=list(cols_to_use))
    print("Файл прочел\n")

    return df, name_to_save


def main():
    print("Введите 1, чтобы указать имя файла и столбцы")
    print("Введите 2, чтобы выйти\n")

    while True:
        menu_num = input()
        print("\n")

        if menu_num == "2":
            print('Программа остановлена')
            exit()
        
        elif menu_num == "1":
            df, cols_to_drop, name_to_save = get_input_data()
            print("\nНачал обработку таблицы...\n")
            save_table(df, cols_to_drop, name_to_save)
            print(f"файл был сохранен под именем {name_to_save}\n\n")
            print("Введите 1, чтобы указать имя файла и столбцы")
            print("Введите 2, чтобы выйти\n")

        else:
            print("Неизвестный код. Введите 1 или 2\n")


if __name__ == "__main__":
    main()

UPD: Попробовал модуль openpyxl, а именно: wb = load_workbook(filename='large_file.xlsx', read_only=True), выдает ошибку: "OverflowError: Python int too large to convert to C long"


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