Структурируйте ваш код в логических сегментах, чтобы вы могли протестировать каждый из них по отдельности
фиктивные данные
Ваши фиктивные данные могут поступать откуда угодно, здесь я сделал это простым генератором
def generate_data():
year = '2018'
week = '10'
cd='1001'
for i in range(1, 14):
cmp_noun = value = i
yield (year, week, cd, cmp_noun, value)
группировка
from itertools import zip_longest
def grouper(iterable, n, fillvalue=None):
"""
Collect data into fixed-length chunks or blocks
https://docs.python.org/3.5/library/itertools.html#itertools-recipes
"""
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)
list(grouper(generate_data(), 5))
группирует данные:
[(('2018', '10', '1001', 1, 1),
('2018', '10', '1001', 2, 2),
('2018', '10', '1001', 3, 3),
('2018', '10', '1001', 4, 4),
('2018', '10', '1001', 5, 5)),
(('2018', '10', '1001', 6, 6),
('2018', '10', '1001', 7, 7),
('2018', '10', '1001', 8, 8),
('2018', '10', '1001', 9, 9),
('2018', '10', '1001', 10, 10)),
(('2018', '10', '1001', 11, 11),
('2018', '10', '1001', 12, 12),
('2018', '10', '1001', 13, 13),
None,
None)]
Сделать рабочую книгу
def generate_workbook(header, data, n=5):
groups = grouper(data, n)
workbook = xlwt.Workbook(encoding='UTF-8')
for i, group in enumerate(groups, 1):
worksheet = workbook.add_sheet(f'sheet{i}')
group = filter(None, group)
populate_sheet(worksheet=worksheet, header=header, data=group)
return workbook
Группирует данные, инициирует WorkBook
. Затем он создает новый лист для каждой группы и заполняет его. filter(None, group)
- отбрасывать оставшиеся строки, когда данные не кратны n
.
заполнить рабочий лист
def populate_sheet(worksheet, header, data):
for i, column in enumerate(header):
worksheet.write(0, i, column)
for row_no, row in enumerate(data, 1):
for i, item in enumerate(row):
worksheet.write(row_no, i, label=item)
Записывает заголовок в первую строку, а затем заполняет следующие строки. Используя enumerate
, мы избавляемся от множества жестко закодированных чисел и делаем все это более универсальным
сохранение рабочей книги
if __name__ == '__main__':
name = 'test.xls'
data = generate_data()
header = ['year', 'week', 'CD', 'keyword', 'importance']
wb = generate_workbook(header=header, data=data, n = 5)
wb.save(name)