Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 24, 2019 11:39:12

Yuriy_V
Зарегистрирован: 2019-12-17
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Извлечь содержимое excel ячейки из 22000 строк

Доброго времени суток.

Стоит задача найти и извлечь содержимое excel ячейки из 22000 строк. Задачу эту решаю через модуль win32com. Пробегаюсь с помощью for по указанному диапазону и извлекаю то что мне нужно, но из-за такого количества строк этот процесс очень долгий около 50секунд, хотя в самом екселе процесс в этом диапазоне занимает пол секунды. Как ускорить это процесс?

Заранее благодарен.

 for i in range(1, 22000): 
    val = sheet.Cells(i, 5).value  # получаем из книги excel ячеку с телефоном
    if val == phone:
        print('Привет')

Офлайн

#2 Дек. 24, 2019 15:30:40

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Извлечь содержимое excel ячейки из 22000 строк

Yuriy_V
этот процесс очень долгий около 50секунд
Все варинаты сводятся к тому чтобы выкинуть в топку эксел(который должен загрузиться и загрузить файл, что занимает немало времени) и com интерфейсы (которые сами по себе безумно медленные).


1. Вариант простой. Запрашивайте не одну ячейку а весь столбец.
2. Вариант общий Через com попросите exel экспортировать таблицу в csv. после этого все проблемы уйдут работа с csv быстрая и простая.
3. Вариант самый симпатичный. Используйте xlrd, openxls и т.п. Работает без эксела и довольно шустро.

Я наиболее часто встречал такой подход. Как только появляется xlsx его надо сразу автоматически читать и писать нужные вам вещи в базу данных (sqlite,mongo, postgress). Ваше время на работу с xls не расходуется, поскольку долгий процесс импорта идет без вашего участия. Вы получаете быстрый произвольный доступ к данным.



Офлайн

#3 Дек. 24, 2019 16:01:12

KoVK
Зарегистрирован: 2019-12-06
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Извлечь содержимое excel ячейки из 22000 строк

попробуйте выставить в False свойства открытого объекта Visible, ScreenUpdating, DisplayAlerts, EnableEvents. Должно ускорить. Но xlrd всяко быстрее

Офлайн

#4 Дек. 24, 2019 17:05:43

Yuriy_V
Зарегистрирован: 2019-12-17
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Извлечь содержимое excel ячейки из 22000 строк

KoVK
попробуйте выставить в False свойства открытого объекта Visible, ScreenUpdating, DisplayAlerts, EnableEvents. Должно ускорить. Но xlrd всяко быстрее

xlrd быстрее, секунд 40 в место 50, но всё же не пол секунды как при работе в родном Excel. Скорее всего есть метод который бы мог обратиться к столбцу целиком, но не могу его найти в гугле((

Офлайн

#5 Дек. 24, 2019 17:28:02

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Извлечь содержимое excel ячейки из 22000 строк

https://xlrd.readthedocs.io/en/latest/installation.html
ps я правильно понимаю вы из экселя сделали голема и … рулите им из пайтона … хм
сюда смотрели
https://autoit-script.ru/docs/libfunctions/excel%20management.htm
https://github.com/jacexh/pyautoit
мне ближе вариант

doza_and
2. Вариант общий Через com попросите exel экспортировать таблицу в csv. после этого все проблемы уйдут работа с csv быстрая и простая.
вот еще один вроде тоже можно попробывать https://pandas.pydata.org/



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

#6 Дек. 24, 2019 19:24:29

KoVK
Зарегистрирован: 2019-12-06
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Извлечь содержимое excel ячейки из 22000 строк

Yuriy_V
Скорее всего есть метод который бы мог обратиться к столбцу целиком, но не могу его найти в гугле((

метод col_values

Yuriy_V
xlrd быстрее, секунд 40 в место 50, но всё же не пол секунды как при работе в родном Excel

или у вас файл экселя кучерявый, или вы в программе что-то намудрили. Как раз, недавно набивал базу данных на 30 тыс. записей из 6 эксельных файлов с промежуточными вычислениями - несколько минут, не дольше. 22 тыс. ячеек перебираются моментально.

Офлайн

#7 Дек. 24, 2019 22:19:44

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Извлечь содержимое excel ячейки из 22000 строк

Yuriy_V
xlrd быстрее, секунд 40 в место 50
Yuriy_V
содержимое excel ячейки из 22000 строк

Сделал файл 40000 строк
 import xlrd
import time
wb=xlrd.open_workbook("out.xlsx")
sheet=wb.sheet_by_index(0)
t0=time.perf_counter()
dat= sheet.col_values(0)
t1=time.perf_counter()
print(t1-t0)
0.012369728996418417
О каких десятках секунд идет речь? На коме может просесть, но не на читалках. Приведите код, который вы используете.



Офлайн

#8 Дек. 26, 2019 08:31:01

Yuriy_V
Зарегистрирован: 2019-12-17
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Извлечь содержимое excel ячейки из 22000 строк

Всем огромное спасибо за подсказки, я воспользовался последним примером от doza_and, сейчас всё просто летает в обработке excel таблицы. Действительно через модуль xlrd реакция на запросы просто мгновенная. Про запросы через COM даже вспоминать теперь не хочется ))

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version