Topic: formattazione output txt  (Letto 126 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline mastraa

  • python unicellularis
  • *
  • Post: 30
  • Punti reputazione: 0
    • Mostra profilo
formattazione output txt
« il: Gennaio 08, 2023, 19:25 »
Buonasera a tutti,

ho la seguente richiesta da fare: devo creare un file di risultati *.txt e vorrei che una certa serie di dati venisse incolonnata in modo ordinato.
Usando il semplice tab (o doppio tab, ma non cambia chiaramente) però non riesco ad aver le colonne bene allineate perchè alcuni dati hanno più caratteri di altri e quindi risulta poco chiaro alla vista perchè alcuni valori sembrano finire sotto una colonna diversa.

C'è modo di usare qualcosa tipo la funzione *.format() che si usa nel print?

Grazie,
Andrea

Offline nuzzopippo

  • python sapiens
  • *****
  • Post: 670
  • Punti reputazione: 0
    • Mostra profilo
Re:formattazione output txt
« Risposta #1 il: Gennaio 09, 2023, 09:31 »
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.

Offline GlennHK

  • python sapiens sapiens
  • ******
  • Post: 1.720
  • Punti reputazione: 1
    • Mostra profilo
    • La Tana di GlennHK
Re:formattazione output txt
« Risposta #2 il: Gennaio 09, 2023, 09:37 »
Ma no, molto più semplicemente si può passare il file a print.

In [1]: fo = open("foo.txt", "w")

In [2]: names = [("foo", "bar"), ("baz", "quux")]

In [3]: for n, m in names:
   ...:     print(f"{n:>10},{m:>10}", file=fo)
   ...:

In [4]: fo.close()

In [5]: !cat foo.txt
       foo,       bar
       baz,      quux

Offline nuzzopippo

  • python sapiens
  • *****
  • Post: 670
  • Punti reputazione: 0
    • Mostra profilo
Re:formattazione output txt
« Risposta #3 il: Gennaio 09, 2023, 09:52 »
Beh ... lo OP parla di dati con dimensioni variabili e di colonne che si sovrappongono, che possano usarsi le stringhe formattate non ci piove, però è quella variabilità di dimensione dei dati che mi ha indotto a proporre una formattazione "con spazi", cosa poi voglia utilizzarsi per scriverli ... non ci ho proprio pensato a stamparli su file ma non è che faccia molta differenza. Imho è più significativo cosa lo OP deve farci, alla fine.

Offline GlennHK

  • python sapiens sapiens
  • ******
  • Post: 1.720
  • Punti reputazione: 1
    • Mostra profilo
    • La Tana di GlennHK
Re:formattazione output txt
« Risposta #4 il: Gennaio 09, 2023, 15:42 »
Sì ma il punto è usare la f-string, poi che usi print o write o quello che ti pare cambia poco.
Quello che facevo notare è che per scrivere su file è sufficiente print.

Offline nuzzopippo

  • python sapiens
  • *****
  • Post: 670
  • Punti reputazione: 0
    • Mostra profilo
Re:formattazione output txt
« Risposta #5 il: Gennaio 09, 2023, 17:11 »
Ed è giustissimo, non obietto in merito anzi ...

Io ho solo concentrato l'attenzione sulla "variabilità" definita dallo OP, il fatto stesso che la ponesse quale problematico l'allineamento per tale "causa" porta a considerarla, poi, certamente, tale considerazione può forse eccedere la stretta risposta alla richiesta fatta.