распределить 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:

→ Ссылка