распределить n-нное количество записей по файлам
Как записывать из словаря list_data по три записи в один word файл, потом следующие три в другой и тд?
list_data=[
{'id':'1', 'name':'вася', 'password':'123'},
{'id':'2', 'name':'john', 'password':'321'},
{'id':'3', 'name':'mike', 'password':'555'},
{'id':'1', 'name':'еще кто то', 'password':'342'},
{'id':'2', 'name':'some', 'password':'67332'},
{'id':'3', 'name':'horse', 'password':'bugaga'}
...................................................
{'id':'1', 'name':'sone n', 'password':'some pass n'},
{'id':'2', 'name':'some n' , 'password':'some pass n'},
{'id':'3', 'name':'some n', 'password':'some pass n'}
]
например 1_output.docs должен содержать
1 вася 123
2 john 321
3 mike 555
следующие три в 2_output.docs и так далее.
код
context = {}
doc = DocxTemplate("шаблон.docx")
for i in list_data:
context['id' + i['id']] = {i['id']}
context['name' + i['id']] = {i['name']}
context['password' + i['id']] = {i['password']}
doc.render(context)
doc.save(f"{i}_output.docx")
при таком коде записывается только в один файл крайние три записи
Ответы (2 шт):
Автор решения: CameL
→ Ссылка
Очевидно что добавив счетчик к имени файла. Я на примере txt сделал, с вордом структура такая же. Если надо три записи в файл, то создаем новый на каждой третьей итерации цикла.
list_data=[
{'id':'1', 'name':'вася', 'password':'123'},
{'id':'2', 'name':'john', 'password':'321'},
{'id':'3', 'name':'mike', 'password':'555'},
{'id':'1', 'name':'еще кто то', 'password':'342'},
{'id':'2', 'name':'some', 'password':'67332'},
{'id':'3', 'name':'horse', 'password':'bugaga'},
{'id':'1', 'name':'sone n', 'password':'some pass n'},
{'id':'2', 'name':'some n' , 'password':'some pass n'},
{'id':'3', 'name':'some n', 'password':'some pass n'}
]
for i in range(len(list_data)):
if i % 3 == 0:
f = open("output" + str(i // 3) + ".txt", 'w')
for v in list_data[i].values():
f.write(str(v) + " ")
f.write("\n")
Автор решения: Антоша Кичаев
→ Ссылка
шаблон.docx
Id= {{ id1 }}
Name= {{ name1 }}
Pass= {{ password1 }}
Id= {{ id2 }}
Name= {{ name2 }}
Pass= {{ password2 }}
Id= {{ id3 }}
Name= {{ name3 }}
Pass= {{ password3 }}
вот такое решение у меня получилось .py
doc = DocxTemplate("шаблон.docx")
context = {}
for i, val in enumerate(start=1, iterable=list_data):
context['id' + val['id']] = val['id']
context['name' + val['id']] = val['name']
context['password' + val['id']] = val['password']
if i % 3 == 0:
doc.render(context)
doc.save(f"{i // 3}_output.docx")
context = {}
if context:
doc.render(context)
doc.save(f"{i // 3 + 1}_output.docx")
в конце нужна проверка если записей было не кратное 3м. поэтому if context: