Çıktı dizesini biçimlendir, sağa hizalama


152

X, y, z koordinatlarını içeren bir metin dosyası işliyorum

     1      128  1298039
123388        0        2
....

her satır, kullanılarak 3 öğeye ayrılmıştır

words = line.split()

Verileri işledikten sonra koordinatları başka bir txt dosyasına geri yazmam gerekir, böylece her sütundaki öğeler sağa hizalanır (ve aynı zamanda girdi dosyası). Her satır koordinatlardan oluşur

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

std::setw()C ++ 'da genişliği ve hizalamayı ayarlamaya izin veren vb. Gibi bir manipülatör var mı ?

Yanıtlar:


238

Daha yeni str.formatsözdizimini kullanarak bu yaklaşımı deneyin :

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

Ve eski %sözdizimini kullanarak bunu nasıl yapacağınız aşağıda açıklanmıştır (Python'un desteklemeyen eski sürümleri için kullanışlıdır str.format):

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

43
"Eski" sözdiziminin ne kadar temiz, okunması daha kolay ve daha kısa olduğuna dikkat edin.
fyngyrz

3
Sağlanandan daha doğrudan bir bağlantı ekleyeceğimi düşündüm: docs.python.org/2/library/…
brw59

50
Kesinlikle daha kısa, daha temizleyicinin gerçekte ne anlama geldiğini bilmiyorum, ancak 'okunması daha kolay' sadece tanıdık olduğu için bence. Bunlardan birine aşina değilseniz, yeni formatın okunması daha kolay görünüyor. Dize biçimlendirme için ".format" kesinlikle yüzde / modulodan daha sezgisel görünüyor. Sağa hizalama için sağ ok da oldukça sezgisel görünüyor.
Mark

2
@Mark Eski yolun daha temiz olmasının bir yolu, daha az karakter kullanmasıdır. Evet, aşinalıkla yeni yöntem sezgisel hale gelir, ancak daha temiz ve basit değildir. Eski yöntem, örnek bir özlülük ve kesinlik dili olan saygıdeğer C dili aracılığıyla bize gelen sözdizimine alışkın olanlar için daha sezgiseldir. Yeni yol için hangi emsal var?
Stephen Boston

3
@StephenBoston Okunabilirliği uzmanlara bırakacağım, ancak yeni yöntem kesinlikle daha temiz. Parenler artık isteğe bağlı değildir. %, bir matematik operatörüyle karıştırılabilir (yine de bağlamda olmasa da bir bakışta emin olabilirsiniz). [N] kelimesi beklenen türde değilse (bu durumda dize) eski yöntem başarısız olur. Yeni yolun gelen türün ne olduğunu bilmesine gerek yoktur, her zaman işe yarar. Temiz ve basit. Dürüst olmak gerekirse, printf stiline hiç alışamadım (çoğunlukla C ile cout yaptım).
Zim

54

Aşağıdakiler kullanılarak elde edilebilir rjust:

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

53

Bunu şu şekilde hizalayabilirsiniz:

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

burada >" sağa hizala " anlamına gelir ve belirli bir değer 8için genişliktir .

Ve işte bir kanıt:

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


       1      128  1298039
  123388        0        2

Ps. listenin paketten çıkarılacağı *lineanlamına gelir line, bu nedenle .format(*line)benzer şekilde çalışır .format(line[0], line[1], line[2])( lineyalnızca üç öğeli bir liste olduğu varsayılır ).



24

İşte 'f-string' biçimini kullanarak nasıl biçimlendirebileceğinizin başka bir yolu:

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}",
)

Bu, aşağıdaki çıktıyı sağlayacaktır:

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

Burada yaptığınız şey, ilk sütunun 15 karakter uzunluğunda olduğunu ve sola dayalı olduğunu ve ikinci sütunun (değerler) 10 karakter uzunluğunda olduğunu ve sağa yaslanmış olduğunu söylüyorsunuz.


Formatların genişliğini parametrelemenin bir yolu var mı? Bu örnekte, biçimlendirmeyi 20 ve 15 genişliğe değiştirmeye karar verirseniz, birden çok satırı değiştirmeniz gerekir. widths = [15, 10] f"{'Trades:':<width[0]}{cnt:>width[1]}",Yukarıdaki gibi bir şey elde etmek istiyorum.
Tomasz Sabała

1
Anladım! Belki birileri bunu faydalı bulacaktır. Bunun için iç içe geçmiş bir paranteze daha ihtiyacım var:f"{'Trades:':<{width[0]}}{cnt:>{width[1]}}"
Tomasz Sabała

1
Bazen en iyi cevaplar, soruya tam olarak cevap vermeyenlerdir. Bunun için teşekkürler! :)
Brian Wiley

6

Çıktının basit tablolaması:

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

çıktı:

variable a    variable b
      0.33         66.67

% 10.2f: 10 minimum uzunluk ve 2 ondalık basamak sayısıdır.


1

Bunu f-string kullanarak ve sondaki basamakların sayısının kontrolü ile yapmak için:

print(f'A number -> {my_number:>20.5f}')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.