Formatta la stringa di output, allineamento a destra


149

Sto elaborando un file di testo contenente le coordinate x, y, z

     1      128  1298039
123388        0        2
....

ogni riga è delimitata in 3 elementi utilizzando

words = line.split()

Dopo aver elaborato i dati ho bisogno di riscrivere le coordinate in un altro file txt in modo che gli elementi in ciascuna colonna siano allineati a destra (così come il file di input). Ogni linea è composta dalle coordinate

line_new = words[0]  + '  ' + words[1]  + '  ' words[2].

Esiste un manipolatore come std::setw()ecc. In C ++ che consente di impostare la larghezza e l'allineamento?

Risposte:


230

Prova questo approccio utilizzando la str.formatsintassi più recente :

line_new = '{:>12}  {:>12}  {:>12}'.format(word[0], word[1], word[2])

Ed ecco come farlo usando la vecchia %sintassi (utile per le versioni precedenti di Python che non supportano str.format):

line_new = '%12s  %12s  %12s' % (word[0], word[1], word[2])

39
Nota come la "vecchia" sintassi sia più pulita, più facile da leggere e più breve.
fyngyrz,

2
Ho pensato di aggiungere un link più diretto di quello fornito: docs.python.org/2/library/…
brw59

48
Più breve di sicuro, non so cosa significhi davvero più pulito, ma "più facile da leggere" è solo perché è familiare, credo. Se non hai già familiarità con uno di essi, il nuovo formato sembra più facile da leggere. ".format" per la formattazione delle stringhe sembra certamente più intuitivo di percentuali / modulo. Anche la freccia a destra per l'allineamento a destra sembra piuttosto intuitiva.
Segna

2
@Mark Un modo alla vecchia maniera è più pulito è che usa meno caratteri. Sì, con familiarità il nuovo modo diventa intuitivo, ma non è più semplice e pulito. Il vecchio modo è più intuitivo per coloro che sono abituati alla sintassi che ci viene incontro attraverso il venerabile linguaggio C, un linguaggio di concisione e precisione esemplari. Quale precedente c'è per il nuovo modo?
Stephen Boston,

2
@StephenBoston Lascerò la leggibilità agli esperti, ma il nuovo modo è assolutamente più pulito. I genitori non sono più opzionali. % può essere confuso con un operatore matematico (anche se, probabilmente, non nel contesto, ma a colpo d'occhio). Il vecchio modo fallirebbe se la parola [n] non fosse del tipo previsto (stringa in questo caso). Il nuovo modo non ha bisogno di sapere quale sia il tipo in entrata, funziona sempre. Pulito e semplice. Ad essere sinceri, non mi sono mai sentito a mio agio con lo stile printf (per lo più ho fatto C con cout).
Zim

53

Si può ottenere usando rjust:

line_new = word[0].rjust(10) + word[1].rjust(10) + word[2].rjust(10)

52

Puoi allinearlo in questo modo:

print('{:>8} {:>8} {:>8}'.format(*words))

dove >significa " allinea a destra " ed 8è la larghezza per un valore specifico.

Ed ecco una prova:

>>> for line in [[1, 128, 1298039], [123388, 0, 2]]:
    print('{:>8} {:>8} {:>8}'.format(*line))


       1      128  1298039
  123388        0        2

Ps. *linesignifica che l' lineelenco verrà decompresso, quindi .format(*line)funziona in modo simile a .format(line[0], line[1], line[2])(supponendo che linesia un elenco con solo tre elementi).



19

Ecco un altro modo in cui puoi formattare usando il formato 'f-string':

print(
    f"{'Trades:':<15}{cnt:>10}",
    f"\n{'Wins:':<15}{wins:>10}",
    f"\n{'Losses:':<15}{losses:>10}",
    f"\n{'Breakeven:':<15}{evens:>10}",
    f"\n{'Win/Loss Ratio:':<15}{win_r:>10}",
    f"\n{'Mean Win:':<15}{mean_w:>10}",
    f"\n{'Mean Loss:':<15}{mean_l:>10}",
    f"\n{'Mean:':<15}{mean_trd:>10}",
    f"\n{'Std Dev:':<15}{sd:>10}",
    f"\n{'Max Loss:':<15}{max_l:>10}",
    f"\n{'Max Win:':<15}{max_w:>10}",
    f"\n{'Sharpe Ratio:':<15}{sharpe_r:>10}",
)

Ciò fornirà il seguente output:

Trades:              2304
Wins:                1232
Losses:              1035
Breakeven:             37
Win/Loss Ratio:      1.19
Mean Win:           0.381
Mean Loss:         -0.395
Mean:               0.026
Std Dev:             0.56
Max Loss:          -3.406
Max Win:             4.09
Sharpe Ratio:      0.7395

Quello che stai facendo qui è che stai dicendo che la prima colonna è lunga 15 caratteri ed è giustificata a sinistra e la seconda colonna (valori) è lunga 10 caratteri ed è giustificata a destra.


C'è un modo per parametrizzare la larghezza dei formati? In questo esempio, se si decide di modificare la formattazione in 20 e 15 larghezze, è necessario modificare più righe. widths = [15, 10] f"{'Trades:':<width[0]}{cnt:>width[1]}",Mi piacerebbe ottenere sth come sopra.
Tomasz Sabała,

1
Fatto! Forse qualcuno lo troverà utile. Ho bisogno di un'altra parentesi nidificata per questo, quindi:f"{'Trades:':<{width[0]}}{cnt:>{width[1]}}"
Tomasz Sabała,

1
A volte le risposte migliori sono quelle che non rispondono alla domanda esatta. Grazie per questo! :)
Brian Wiley il

5

Semplice tabulazione dell'output:

a = 0.3333333
b = 200/3
print("variable a    variable b")
print("%10.2f    %10.2f" % (a, b))

produzione:

variable a    variable b
      0.33         66.67

% 10.2f: 10 è la lunghezza minima e 2 è il numero di cifre decimali.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.