web-dev-qa-db-fra.com

Python: Format de la chaîne de sortie, alignement à droite

Je traite un fichier texte contenant les coordonnées x, y, z

     1      128  1298039
123388        0        2
....

chaque ligne est délimitée en 3 éléments en utilisant

words = line.split()

Après le traitement des données, j'ai besoin d'écrire les coordonnées dans un autre fichier txt afin que les éléments de chaque colonne soient alignés à droite (ainsi que le fichier d'entrée). Chaque ligne est composée des coordonnées

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

Existe-t-il un manipulateur comme std::setw() etc. en C++ permettant de définir la largeur et l'alignement?

130
justik

Essayez cette approche en utilisant la nouvelle version str.format syntaxe :

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

Et voici comment procéder à l'aide de l'ancienne syntaxe % (utile pour les anciennes versions de Python qui ne prend pas en charge str.format):

line_new = '%12s  %12s  %12s' % (Word[0], Word[1], Word[2])
198
Mark Byers

Vous pouvez l'aligner comme ça:

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

> signifie "aligner à droite" et 8 est le largeur pour une valeur spécifique.

Et voici une preuve:

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


       1      128  1298039
  123388        0        2

Ps. *line signifie que la liste line sera décompactée, donc .format(*line) fonctionne de la même manière que .format(line[0], line[1], line[2]) (en supposant que line est une liste de trois éléments seulement).

47
Tadeck

Cela peut être réalisé en utilisant rjust:

line_new = Word[0].rjust(10) + Word[1].rjust(10) + Word[2].rjust(10)
44
clwen

J'apprécie vraiment une nouvelle interpolation de chaîne littérale dans Python 3.6+:

line_new = f'{Word[0]:>12}  {Word[1]:>12}  {Word[2]:>12}'

Référence: PEP 498 - Interpolation de chaîne littérale

17
dmitry_romanov

Simple tabulation de la sortie:

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

sortie:

variable a    variable b
      0.33         66.67

% 10.2f: 10 est la longueur minimale et 2 le nombre de décimales.

5
Thoran

Voici un autre moyen de formater en utilisant le format '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}",
)

Cela fournira la sortie suivante:

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

Ce que vous faites ici, c'est que vous dites que la première colonne a une longueur de 15 caractères et qu'elle est justifiée à gauche, tandis que la deuxième colonne (valeurs) compte 10 caractères et qu'elle est justifiée à droite.

4
Vlad Bezden