Вы можете использовать itertools.zip_longest :
itertools.zip_longest (* iterables, fillvalue = None)
Создайте итератор, который объединяет элементы из каждого итераций. Если итерируемые элементы имеют неравную длину, отсутствующие значения заполняются значением fillvalue. Итерация продолжается до тех пор, пока не будет исчерпана самая длинная итерация
Вы не показали, как выглядят ваши данные, но для того, чтобы остальная часть вашего кода работала, вы можете использовать dict с 'data'
ключ и пустая строка в качестве значения для отсутствующих данных:
from itertools import zip_longest
for x, y, p, q in zip_longest(cursor_X, cursor_Y,
cursor_P, cursor_Q,
fillvalue={'data':''}):
data1 = x
data2 = y
data3 = p
data4 = q
print(str(data1['data']), end="")
print("\t" + str(data2['data']), end="")
print("\t" + str(data2['data']), end="")
print("\t" + str(data2['data']))
Обратите внимание, что вы можете переписать содержимое l oop без ненужных промежуточных переменных:
for x, y, p, q in zip_longest(cursor_X, cursor_Y, cursor_P, cursor_Q,
fillvalue={'data':''}):
out = '\t'.join(map(str, (x, y, z, t)))
print(out)
или даже:
for items in zip_longest(cursor_X, cursor_Y, cursor_P, cursor_Q,
fillvalue={'data':''}):
out = '\t'.join(map(str, items))
print(out)