Fermo restando che sia quando stampi a video sia quando scrivi in un file stringhe di testo stai comunque manipolando stringhe e le funzioni di formattazione delle stringhe agiscono in entrambi i casi, sei un po "vago" rispetto alla situazione che devi affrontare.
Se ciò che realizzi deve essere rappresentato nel terminale o con un editor tramite caratteri a passo fisso, del testo "incolonnato" è facile da realizzarsi, anche se personalmente userei degli spazi e non tabulazioni per definire le righe di testo, per la maggiore facilità di controllo, basterebbe calcolarsi la massima occupazione di ogni singola colonna ed integrare i dati con gli spazi necessari ... ti faccio un esempio con dati "a menga" separando con tre spazi le singole colonne:
NzP:~$ python3
Python 3.10.6 (main, Nov 14 2022, 16:10:14) [GCC 11.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> data = '''NOME;ETA;PROFESSIONE
... Paperon De Paperoni;90;taccagno
... Paolino Paperino;45;sfigato
... Qui;9;studente
... Quo;9;studente
... Qua;9;studente
... Gastone Paperone;40;fortunello'''
>>> nomi = [x.rstrip('\n').split(';') for x in data.splitlines()]
>>> for n in nomi:
... print(n)
...
['NOME', 'ETA', 'PROFESSIONE']
['Paperon De Paperoni', '90', 'taccagno']
['Paolino Paperino', '45', 'sfigato']
['Qui', '9', 'studente']
['Quo', '9', 'studente']
['Qua', '9', 'studente']
['Gastone Paperone', '40', 'fortunello']
>>> widths = [] # calcolo massime lunghezze
>>> for i in range(len(nomi[0])):
... widths.append(max([len(x[i]) for x in nomi]))
...
>>> widths
[19, 3, 11]
>>> f_name = 'es_per_mastraa.txt'
>>> with open(f_name, 'w') as f:
... for n in nomi:
... row = ' '.join([n[i]+' '*(widths[i]-len(n[i])) for i in range(len(n))])
... f.write(row+'\n')
...
40
40
40
40
40
40
40
>>>
l'output del file prodotto sarebbe:
NzP:~$ cat es_per_mastraa.txt
NOME ETA PROFESSIONE
Paperon De Paperoni 90 taccagno
Paolino Paperino 45 sfigato
Qui 9 studente
Quo 9 studente
Qua 9 studente
Gastone Paperone 40 fortunello
NzP:~$
Ovviamente ciò vale nella ipotesi "carattere a passo fisso", basterebbe già l'uso di un carattere a passo variabile per inficiare tutto il discorso, per altro, sarebbe un sistema "scomodo" se le Tue finalità prevedano uno scambio di dati o altro.