Можно ли отформатировать строку с помощью цикла?
Хотел автоматически вставить в текст данные с базы 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 шт):
попробуйте место
.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')
>>>
Т.е интерация происходит только в первом случае с выбора всех элементов столбца , в то время как со срокой интерации нет