Можно ли отформатировать строку с помощью цикла?

Хотел автоматически вставить в текст данные с базы sql . При этом не переписывать все столбцы отдельно (там у меня их 17 штук :) ) , а вставить в формат с помощью цикла. Я попробовал так

save_savew = Label(text = "name {0} , salary {1} , pasport {2} ,position {3} , priorety {4}\n days of work\n  Sunday : morning - {5} , evenyng - {6} \n Monday : morning - {7} , evenyng - {8} \n Tuesday : morning - {9} , evenyng - {10} \n Wednesday : morning - {11} , evenyng - {12} \n Thursday: morning - {13} , evenyng - {14} \n Friday : morning - {15} \n Saturday : evenyng - {16} \n SAVED ".format(k for k in sql.execute("SELECT * FROM users WHERE pasport = '{pasport_addw.get()}'")))

И получил вот это

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Programs\Python38-32\lib\tkinter\__init__.py", line 1883, in __call__
    return self.func(*args)
  File "C:\Python\manager\Main.py", line 152, in <lambda>
    Save_worker(btn, n_a, s_a, p_a, po_a, pr_a, su_a_m , su_a_e , mo_a_m , mo_a_e , tu_a_m , tu_a_e , we_a_m, we_a_e, th_a_m , th_a_e , fr_a_m , sa_a_e))
  File "C:\Python\manager\Main.py", line 67, in Save_worker
    save_savew = Label(text = "name {0} , salary {1} , pasport {2} ,position {3} , priorety {4}\n days of work\n  Sunday : morning - {5} , evenyng - {6} \n Monday : morning - {7} , evenyng - {8} \n Tuesday : morning - {9} , evenyng - {10} \n Wednesday : morning - {11} , evenyng - {12} \n Thursday: morning - {13} , evenyng - {14} \n Friday : morning - {15} \n Saturday : evenyng - {16} \n SAVED ".format(sql.execute("SELECT * FROM users WHERE pasport = '{pasport_addw.get()}'")))
IndexError: Replacement index 1 out of range for positional args tuple

Какие могут быть варианты ? По идее данным способом я получаю данные с таблицы sql в виде списка и .format() должен был их просто заместить в тексте . Я попробовал прописать это способом .format(k for k in y ) , но получил такой же ответ ....


Ответы (2 шт):

Автор решения: Danis

попробуйте место

.format(k for k in sql.execute("SELECT * FROM users WHERE pasport = '{pasport_addw.get()}'"))

писать

.format(*sql.execute("SELECT * FROM users WHERE pasport = '{pasport_addw.get()}'"))

знак * - это распаковка

→ Ссылка
Автор решения: Давид

Разобрался в чём дело . Оказывается если запустить считывание столбца (например SELECT pasport FROM users) , то он выдаст интерируемый НАБОР ЭЛЕМЕНТОВ , но если запустить считывание строки ("SELECT * FROM users WHERE pasport = %s" %pasport.get()") , то будет выдана СТРОКА , которую через цикл можно будет прокрутить 1 раз , почему sqlite3 работает так неудобно я не понимаю ,возможно я чего-то не знаю :) Т.е сейчас мне нужно будет преобразовывать через split() строку в список и только потом пропускать через цикл. При этом , так же нужно будет исключить возможные ошибки ( пользователь при вводе данных поставит лишний пробел или запятую) . Кто-нибудь может подсказать более простой способ ?

Для наглядного примера для тех , кто считает что я пишу чушь :

import sqlite3
db=sqlite3.connect('server.db')
sql = db.cursor()
for a, x in enumerate (sql.execute("SELECT name FROM users" )) :
    print(a,x)

for b,i in enumerate (sql.execute("SELECT * FROM users WHERE name = 'David'")):
    print(b,i)
    b=+1

Результат:

0 ('David',)
1 ('Yael',)
2 ('Aron',)
3 ('Dmitry',)
4 ('Amit',)
5 ('Shaya',)
6 ('Evgeny',)
7 ('Ivan',)
8 ('Artem',)
0 ('David', 35, '336361126', '1', 'manager', 'no', 'yes', 'no', 'no', 'yes', 'no', 'no', 'yes', 'no', 'yes', 'no', 'yes')
>>> 

Т.е интерация происходит только в первом случае с выбора всех элементов столбца , в то время как со срокой интерации нет

→ Ссылка