Ускорение чтения большой таблицы в 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"