Ускорение цикла, итерация по относительно большому листу Excel в Python - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь извлечь данные из каждой строки таблицы Excel, когда число, которое я тестирую для каждой строки, соответствует предварительно заданным диапазонам, которые я создал. Код работает, но движется при сканировании. Я пытаюсь перебрать лист, содержащий 200 000 строк данных, и заметил, что когда я разбиваю лист на более мелкие сегменты, программа выполняется быстрее, но все же не так быстро, как хотелось бы. Я не могу понять, почему это тоже.

Любые рекомендации о том, как я мог бы ускорить это?

import xlsxwriter
import openpyxl
import os
from tqdm import tqdm

os.chdir(r'C:\Users\JTNeumay\Desktop\test folder')
xlfile = 'test.xlsx'
wb = openpyxl.load_workbook(xlfile, read_only=True)
sheet = wb['Sheet1']

newbook = xlsxwriter.Workbook('Commercial.xlsx')
newbook2 = xlsxwriter.Workbook('Industrial.xlsx')
newsheet = newbook.add_worksheet()
newsheet2 = newbook2.add_worksheet()
i = 1
j = 1

for row in tqdm(range(1, sheet.max_row + 1)):
    check = sheet.cell(row=row, column=11).value
    if check is not None:
        if (220000 <= check <= 221310 or 221320 <= check <= 221330 or 237200 <= check <= 237210 or 334611 <= check
                <= 334612 or 420000 <= check <= 493190 or 511210 <= check <= 512210 or 512240 <= check <= 541310 or
                541330 <= check <= 541340 or 541370 <= check <= 541700 or 541720 <= check <= 562900 or 562920 <= check
                <= 811430 or 812000 <= check <= 983000):
            for column in range(1, sheet.max_column + 1):
                newsheet.write(i, column, sheet.cell(row=row, column=column).value)
            i += 1
        elif (210000 <= check <= 213115 or 230000 <= check <= 237130 or 237300 <= check <= 334610 or 334613 <=
                check <= 339999 or 510000 <= check <= 511200 or 512220 <= check <= 512230 or check == 541320 or
                check == 541360 or check == 541710 or check == 562910 or check == 811490):
            for column in range(1, sheet.max_column + 1):
                newsheet2.write(i, column, sheet.cell(row=row, column=column).value)
            j += 1
        else:
            pass
    else:
        pass
newbook.close()
newbook2.close()

Обратите внимание, что я также использовал метод, в котором я создал два списка с диапазонами в операторах if и обнаружил, что этот метод занимает гораздо больше времени.

1 Ответ

0 голосов
/ 20 ноября 2018

Вопрос : Итерация времени цикла ускорения

Попробуйте это openpyxl только решение:

Вернитесь и сообщите о своей скорости.

# Create new Workbooks
wb1 = Workbook()
ws1 = wb1.active
wb2 = Workbook()
ws2 = wb2.active

# Predefine Ranges and Target Worksheet
# You can gain additional speed, by sorting the range tuples 
# of the most expected Ranges, to the beginning.
ranges = [(2, 3, ws1), (221320, 221330, ws2), (237200, 237210, ws1), (812000, 983000, ws2)]

# The Row to start
min_row = 2

# Iterate all Cells in Column 'min/max_col'
for row, cell in enumerate(next(ws.iter_cols(min_row=min_row, min_col=2, max_col=2)), min_row):

    if cell.value:
        # Condition: If cell.value in Range(...)
        for r in ranges:
            if (r[0] <= cell.value <= r[1]):
                # Match: Append this 'row' to the given Worksheet
                r[2].append([cell.value for cell in next(ws.iter_rows(min_row=row, max_row=row))])
                break

# Save Worksheets
wb1.save('../test/test1.xlsx')
wb2.save('../test/test2.xlsx')

Протестировано с Python: 3.4.2 - openpyxl: 2.4.1 - LibreOffice: 4.3.3.2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...