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?
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])
Vous pouvez l'aligner comme ça:
print('{:>8} {:>8} {:>8}'.format(*words))
où >
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).
Cela peut être réalisé en utilisant rjust
:
line_new = Word[0].rjust(10) + Word[1].rjust(10) + Word[2].rjust(10)
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
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.
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.