Rodegast
См. то что я написал выше + в место списков возвращай генератор, замени вложенные списки кортежами.
Кортежами заменил, возвращаю генератор, но столкнулся с проблемой. Изначально код был слегка сложнее, а именно
d = [[r[2], r[3], r[8], r[7], r[29], r[10]] for r in [x.split('\t') for x in open(filepath, 'r')] if len(r) == 40] or [[r[0], r[2], r[6], r[12], r[19], r[10]] for r in [x.split('\t') for x in open(filepath, 'r')] if len(r) == 33]
поскольку файл может приходить в двух вариантах и нужные столбцы меняют свое положение. Тут все было хорошо, в зависимости от того какой файл пришел, один из списков был пустой и по
or в d присваивался полный список.
Сделал
d = ((r[2], r[3], r[8], r[7], r[29], r[10]) for r in (x.split('\t') for x in open(filepath, 'r')) if len(r) == 40) or ([r[0], r[2], r[6], r[12], r[19], r[10]] for r in (x.split('\t') for x in open(filepath, 'r')) if len(r) == 33)
но с генераторами
or не работает, потому что в любом случае возвращается объект генератора, даже если он пустой.
Как вариант я могу присваивать их двум разным переменным, и дважды вызывать executemany() сначала с одним потом с другим. Но может есть вариант сложить генераторы, что-то типа union в sql?