Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 16.09.2022
Сообщений: 8

Долгие операции над данными Excel

16.09.2022, 15:46. Показов 4731. Ответов 16

Студворк — интернет-сервис помощи студентам
Здравствуйте, прошу помочь со скоростью выполнения операций над данными в xlsx файле. Сделал криво, понимаю. Первые 200 значений считаются и выводятся довольно таки быстро, а вот остальные высчитываются очень долго. В эксель файле 5000 строк, 2600 строк считало в течение 2 часов. Хотелось бы как-то ускорить процесс но не знаю как. Есть вариант .xlsx конвертировать в .txt и считать через .txt и не создавать доп файлов формата .xlsx, но пока не знаю как это реализовать. Заранее спасибо.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import openpyxl
import csv
 
k1 = float(input('введите число k1:'))
k2 = float(input('введите число k2:'))
k3 = float(input('введите число k3:'))
k4 = float(input('введите число k4:'))
k5 = float(input('введите число k5:'))
k6 = float(input('введите число k6:'))
k7 = float(input('введите число k7:'))
k8 = float(input('введите число k8:'))
k9 = float(input('введите число k9:'))
f = open('text1.txt', 'w')
 
book = openpyxl.open('Dannye.xlsx', read_only=True)
sheet = book.active
for row in range(1, sheet.max_row+1):
    one = sheet[row][0].value
    two = sheet[row][1].value
    three = sheet[row][2].value
    four = sheet[row][3].value
    five = sheet[row][4].value
    six = sheet[row][5].value
    seven = sheet[row][6].value
    eight = sheet[row][7].value
    nine = sheet[row][8].value
    f1 = float(one) * k1
    f2 = float(two) * k2
    f3 = float(three) * k3
    f4 = float(four) * k4
    f5 = float(five) * k5
    f6 = float(six) * k6
    f7 = float(seven) * k7
    f8 = float(eight) * k8
    f9 = float(nine) * k9
    f_sum = float(pow((f1 + f2 + f3 + f4 + f5 + f6 + f7 + f8 + f9 + 3104), 0.5))
    print(row, f_sum)
 
    f = open('text1.txt', 'a')
    for i in range(1):
        f.write(str(f_sum) + '\n')
    f.close()
 
    input_file = 'text1.txt'
    output_file = 'Dannye1.xlsx'
 
    wb = openpyxl.Workbook()
    ws = wb.worksheets[0]
    with open(input_file, 'r') as data:
        reader = csv.reader(data, delimiter='\t')
        for row in reader:
            ws.append(row)
 
    wb.save(output_file)
print()
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.09.2022, 15:46
Ответы с готовыми решениями:

Операции над строковыми данными
Доброго. В консольном приложении надо из слов "Traktorist" и "Krasota" сделать "Stroka". При этом нельзя добавлять новые переменные. ...

Программа на языке ассемблера, которая выполняет межсегментные переходы и операции сдвига над данными
1. Написать программу на языке ассемблера, которая выполняет межсегментные переходы и операции сдвига над данными. 1.1. В программе...

Долгие асинхронные операции и очень быстрый пользователь
Минимальный пример: 1. В UI есть поле ввода. 2. Пользователь вносит изменения в данные. Срабатывает событие. 3. По событию нужно: ...

16
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
16.09.2022, 16:54
zxcplayer, Строка 40 порадовала
for i in range(1):
1
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,760
16.09.2022, 16:59
zxcplayer, ты в цикле 5000 раз открываешь и закрываешь файл, не удивительно, что медленно..
1
0 / 0 / 0
Регистрация: 16.09.2022
Сообщений: 8
17.09.2022, 12:33  [ТС]
anton78spb, Ой, не заметил

Добавлено через 1 минуту
Цитата Сообщение от u235 Посмотреть сообщение
zxcplayer, ты в цикле 5000 раз открываешь и закрываешь файл, не удивительно, что медленно..
Не подскажете как это исправить? Именно Dannye.xlsx открывается 5000 раз? Потому что именно первые 37 строк работают очень долго, но вроде строка открытия файла записана до цикла
0
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
17.09.2022, 12:52
Цитата Сообщение от zxcplayer Посмотреть сообщение
Именно Dannye.xlsx открывается 5000 раз?
Нет, в строках 39-42. открывается на добавление файл text1.txt, идет запись и закрывается.
Python
1
2
3
4
    f = open('text1.txt', 'a')
    for i in range(1):
        f.write(str(f_sum) + '\n')
    f.close()
Вынесите его открытие вне цикла, выше строчки 17. А закроете файл уже после цикла.
С ваших слов в фале Dannye.xlsx 5000 строк. Соответственно цикл выполняется 5000 раз.
Python
1
for row in range(1, sheet.max_row+1):
0
0 / 0 / 0
Регистрация: 16.09.2022
Сообщений: 8
17.09.2022, 12:58  [ТС]
Цитата Сообщение от anton78spb Посмотреть сообщение
Нет, в строках 39-42. открывается на добавление файл text1.txt, идет запись и закрывается.
Python
1
2
3
4
    f = open('text1.txt', 'a')
    for i in range(1):
        f.write(str(f_sum) + '\n')
    f.close()
Вынесите его открытие вне цикла, выше строчки 17. А закроете файл уже после цикла.
С ваших слов в фале Dannye.xlsx 5000 строк. Соответственно цикл выполняется 5000 раз.
Python
1
for row in range(1, sheet.max_row+1):
Код запускал только с помощью первых 37 строк, на скорость оставшиеся строки не влияют, сама операция над строками файла эксель идет долгая, не знаю как это исправить, а строки 39-42 я изменил, убрал цикл и f.close поставил вне цикла

Добавлено через 1 минуту
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    f = open('text1.txt', 'a')
    f.write(str(f_sum) + '\n')
 
    input_file = 'text1.txt'
    output_file = 'Dannye1.xlsx'
 
    wb = openpyxl.Workbook()
    ws = wb.worksheets[0]
    with open(input_file, 'r') as data:
        reader = csv.reader(data, delimiter='\t')
        for row in reader:
            ws.append(row)
 
    wb.save(output_file)
f.close()
В итоге с 39 по 53 строку теперь код выглядит так
0
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
17.09.2022, 12:58
del.
0
0 / 0 / 0
Регистрация: 16.09.2022
Сообщений: 8
17.09.2022, 13:00  [ТС]
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import openpyxl
 
k1 = -0.022
k2 = 1.165
k3 = 0.53
k4 = 2.568
k5 = 4.355
k6 = 0.763
k7 = -3.567
k8 = -0.13
k9 = 2.85
 
book = openpyxl.open('Dannye.xlsx', read_only=True)
sheet = book.active
for row in range(1, sheet.max_row+1):
    one = sheet[row][0].value
    two = sheet[row][1].value
    three = sheet[row][2].value
    four = sheet[row][3].value
    five = sheet[row][4].value
    six = sheet[row][5].value
    seven = sheet[row][6].value
    eight = sheet[row][7].value
    nine = sheet[row][8].value
    f1 = float(one) * k1
    f2 = float(two) * k2
    f3 = float(three) * k3
    f4 = float(four) * k4
    f5 = float(five) * k5
    f6 = float(six) * k6
    f7 = float(seven) * k7
    f8 = float(eight) * k8
    f9 = float(nine) * k9
    f_sum = float(pow((f1 + f2 + f3 + f4 + f5 + f6 + f7 + f8 + f9 + 3104), 0.5))
    print(row, f_sum)
 
print()
изначально код был такой, без записи, тут код тоже пишет очень долго, то есть, запись вообще не влияла на скорость. Может openpyxl сама по себе долгая?
0
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
17.09.2022, 13:03
Цитата Сообщение от zxcplayer Посмотреть сообщение
Код запускал только с помощью первых 37 строк
Я правильно понял, что когда вы замеряли скорость, то код состоял только из первых 37 строк?
И соответственно.
Цитата Сообщение от zxcplayer Посмотреть сообщение
2600 строк считало в течение 2 часов.
0
0 / 0 / 0
Регистрация: 16.09.2022
Сообщений: 8
17.09.2022, 13:04  [ТС]
Цитата Сообщение от anton78spb Посмотреть сообщение
Я правильно понял, что когда вы замеряли скорость, то код состоял только из первых 37 строк?
И соответственно.
Да, именно, я сам виноват, что скинул код с записью данных в отдельные файлы, извиняюсь за это
0
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
17.09.2022, 13:05
Цитата Сообщение от zxcplayer Посмотреть сообщение
Может openpyxl сама по себе долгая?
Возможно, я никогда не работал с этой библиотекой.
0
0 / 0 / 0
Регистрация: 16.09.2022
Сообщений: 8
17.09.2022, 13:05  [ТС]
Самый последний отправленный мною код, считал 2600 строк в течение двух часов
0
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,760
17.09.2022, 13:14
zxcplayer, нет, txt1 и Dannye1 открываются по 5000 раз (сколько строк)
Вот так попробуйте и разберитесь с кодом, что и как работает.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import openpyxl
 
output_file = 'Dannye1.xlsx'
input_file = 'Dannye.xlsx'
 
k=[] # вектор констант
for i in range(9):
    k.append(float(input(f'введите число k{i+1}:'))) # заполняем список констант
 
book = openpyxl.open(input_file, read_only=True)
sheet = book.active
data=[] 
for row in range(1, sheet.max_row+1):
    f=[]
    for col in range(9):
        f.append(float(sheet[row][i].value)*k[i])
    f_sum = (sum(f) + 3104)**0.5
    print(row, f_sum)
    data.append(f_sum) # добавляем очередную f_sum в список data
 
# все, мы прочитали из входного файла, посчитали и создали список data
# а теперь просто пишем в выходной файл
wb = openpyxl.Workbook()
ws = wb.worksheets[0]
for row in data:
    ws.append(row)
wb.save(output_file)
print()
Добавлено через 3 минуты
А вообще, тоже самое можно в самом Excel формулами сделать, без Python.
0
0 / 0 / 0
Регистрация: 16.09.2022
Сообщений: 8
17.09.2022, 13:19  [ТС]
Цитата Сообщение от u235 Посмотреть сообщение
zxcplayer, нет, txt1 и Dannye1 открываются по 5000 раз (сколько строк)
Вот так попробуйте и разберитесь с кодом, что и как работает.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import openpyxl
 
output_file = 'Dannye1.xlsx'
input_file = 'Dannye.xlsx'
 
k=[] # вектор констант
for i in range(9):
    k.append(float(input(f'введите число k{i+1}:'))) # заполняем список констант
 
book = openpyxl.open(input_file, read_only=True)
sheet = book.active
data=[] 
for row in range(1, sheet.max_row+1):
    f=[]
    for col in range(9):
        f.append(float(sheet[row][i].value)*k[i])
    f_sum = (sum(f) + 3104)**0.5
    print(row, f_sum)
    data.append(f_sum) # добавляем очередную f_sum в список data
 
# все, мы прочитали из входного файла, посчитали и создали список data
# а теперь просто пишем в выходной файл
wb = openpyxl.Workbook()
ws = wb.worksheets[0]
for row in data:
    ws.append(row)
wb.save(output_file)
print()
Добавлено через 3 минуты
А вообще, тоже самое можно в самом Excel формулами сделать, без Python.
Ваш код работает с той же скоростью, что и тот, который я скинул. Эксель формулами сделать проще, но дали задание, чтобы по одной кнопке строки умножались на определенные значения и выводились подсчитанные данные. Сейчас нашел команду iter_rows, может с ней попробую что-то сделать
0
5516 / 2869 / 571
Регистрация: 07.11.2019
Сообщений: 4,760
17.09.2022, 16:06
Лучший ответ Сообщение было отмечено zxcplayer как решение

Решение

Цитата Сообщение от zxcplayer Посмотреть сообщение
Ваш код работает с той же скоростью, что и тот, который я скинул.
Ага, медленно из-за чтения по одной ячейке.
Вот исправленый вариант на итераторе:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import openpyxl
 
output_file = 'Dannye1.xlsx'
input_file = 'Dannye.xlsx'
 
k=[] # вектор констант
for i in range(9):
    k.append(float(input(f'введите число k{i+1}:'))) # заполняем список констант
#k=[1,2,3,4,5,6,7,8,9]
book = openpyxl.open(input_file, read_only=True)
sheet = book.active
data=[] 
 
for row in sheet.iter_rows(min_row=1, max_col=9, max_row=sheet.max_row):
    f=[]
    for cell in row:
        f.append(float(cell.value))
    f_sum=(sum(i*j for i,j in zip(k,f))+3104)**0.5
    data.append(f_sum) 
    
print(*data, sep='\n')
 
 
# все, мы прочитали из входного файла, посчитали и создали список data
# а теперь просто пишем в выходной файл
wb = openpyxl.Workbook()
ws = wb.worksheets[0]
for row in data:
    ws.append([row])
wb.save(output_file)
print()
У меня за секунду примерно 5000 строк обрабатывает.
3
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
17.09.2022, 16:21
Лучший ответ Сообщение было отмечено zxcplayer как решение

Решение

zxcplayer, Если заменить open на load_workbook начинает работать еще быстрее. Я так понял, что при open программа за данными обращается к файлу на диске, а если использовать load_workbook, то файл сразу загружается в память, и обработка данных идет гораздо быстрее.
2
0 / 0 / 0
Регистрация: 16.09.2022
Сообщений: 8
17.09.2022, 17:57  [ТС]
Спасибо, замен open на load_workbook и все ячейки ввел в один print() обработалось за пару секунд. Проблема решена!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.09.2022, 17:57
Помогаю со студенческими работами здесь

Как сделать чтобы столбце в DBGrid заполнялся данными получаемыми из математических действий над данными из других столбцов и таблиц
Добрый день. мея такой вопрос. Есть БД Access ADOConnection -> ADOTable->DataSource Приложение пишу на Delphi7 Имеются две формы:...

Арифметические операции с данными
В ASP совсем зелёный... У меня возник вопрос : - Мне необходимо выполнить арифметические операции ( +, -, *, / ) используя данные...

Операции с обобщенными данными
Требуется: 1.Проверить соответствует ли тип значения хранимого в объекте Source заданному типу T. 2.Проверить, входит ли значение из...

Операции над числами
Как разбить число на составляющие цифры и каждую из них вынести в список как тип данных int

Операции над указателями
int var = 123; int *p = &var; (*p)++ и ++*p это одно и тоже. В первом случае приоритет задал скобками. 1)Тогда почему *p++ и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru