223 votes

Formatage 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 à l'aide de

words = line.split()

Après avoir traité les données, j'ai besoin d'écrire les coordonnées dans un autre fichier txt de façon à ce 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 ?

331voto

Mark Byers Points 318575

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

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

Et voici comment procéder avec l'ancienne méthode % (utile pour les anciennes versions de Python qui ne supportent pas la syntaxe str.format ) :

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

85voto

Vlad Bezden Points 5024

Voici une autre façon 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}",
)

Le résultat est le suivant :

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 la première colonne contient 15 caractères et est justifiée à gauche, tandis que la deuxième colonne (valeurs) contient 10 caractères et est justifiée à droite.

Si vous joignez des éléments de la liste et que vous souhaitez formater l'espace entre les éléments, vous pouvez utiliser `` et des techniques de formatage régulières.

Cet exemple sépare chaque nombre par 3 espaces. La clé est ici f"{'':>3}"

print(f"{'':>3}".join(str(i) for i in range(1, 11)))

de la production :

1   2   3   4   5   6   7   8   9   10

81voto

Tadeck Points 37046

Vous pouvez l'aligner ainsi :

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

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

En voici la 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 le line sera décompactée, de sorte que .format(*line) fonctionne de la même manière que .format(line[0], line[1], line[2]) (en supposant que line est une liste avec seulement trois éléments).

69voto

clwen Points 2715

Elle peut être obtenue en utilisant rjust :

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

41voto

dmitry_romanov Points 339

J'apprécie beaucoup la nouvelle interpolation des chaînes littérales dans Python 3.6+ :

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

Référence : PEP 498 -- Interpolation de chaînes littérales

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X