Python dizesini boşluklarla nasıl doldurabilirim?


509

Bir dizeyi boşluklarla doldurmak istiyorum. Aşağıdakilerin sıfırlar için çalıştığını biliyorum:

>>> print  "'%06d'"%4
'000004'

Ama bunu istediğim zaman ne yapmalıyım ?:

'hi    '

Tabii ki dize uzunluğunu ölçebilir ve yapabilirim str+" "*leftover, ama en kısa yolu istiyorum.


1
Gelecekte kullanımdan kaldırılabileceğini biliyorum, ama yine de bu eski yöntemi sevdim: "%-6s" % ssola hizalanmış ve "%6s" % ssağa hizalanmış.
Basj

Yanıtlar:


700

Bunu aşağıdakilerle yapabilirsiniz str.ljust(width[, fillchar]):

Uzunluk genişliğinde bir dizede iki yana yaslanmış sola döndür . Dolgu, belirtilen dolgu şeması kullanılarak yapılır (varsayılan boşluktur). Genişlik küçükse orijinal dize döndürülür len(s).

>>> 'hi'.ljust(10)
'hi        '

18
@simon'un cevabı, daha karmaşık dizeleri biçimlendirirken daha esnek ve daha kullanışlıdır
CoatedMoose

3
veya @abbot 'un eski python sürümlerini desteklemişseniz
CoatedMoose

1
ljust () artık kullanımdan kaldırıldı. Bunu yapmanın doğru yolu için stackoverflow.com/questions/14776788/… adresine bakın
Mawg, Monica

Python 3'e mi gitti? Sadece aynı şekilde çalışan ancak farklı hizalamalar için rjust ve merkez var
radtek

17
ljust (), rjust () yalnızca dize modülünden kaldırılmıştır. Str yerleşik tipte mevcuttur.
Rohan Grover

373

Komplike dize biçimlendirirken, muhtemelen kullanmalısınız bile çalışır esnek bir yöntem için dize biçimlendirme mini dili kullanarak, str.format()yöntem

>>> '{0: <16} StackOverflow!'.format('Hi')  # Python >=2.6
'Hi               StackOverflow!'

bir f-dizeleri

>>> f'{"Hi": <16} StackOverflow!'  # Python >= 3.6
'Hi               StackOverflow!'

11
Değişkende '16' varsa ne olur?
Randy

Ben de anladım. Bunu göndermeliydim. Dokümanlar bunun Py2.6 için çalışması gerektiğini söylüyor, ancak bulgularım başka türlü. Py2.7 de çalışıyor.
Randy

1
Ulusal aksan kullanırken bu tür biçimlendirme ile ilgili sorunlar yaşadım. 'Kra' ve 'krá' nın aynı olmasını istersiniz, ama değildi.
quapka

77
@Randy'{message: <{fill}}'.format(message='Hi', fill='16')
CivFan

19
str.format()Yalnızca tek {...}ve başka hiçbir şeye sahip şablonlar için kullanmayın . Sadece kullanmak format()işlevi ve havai ayrıştırma kendini kurtar: format('Hi', '<16').
Martijn Pieters

119

Yeni (ish) dize biçimi yöntemi , yuvalanmış anahtar kelime bağımsız değişkenleriyle bazı eğlenceli şeyler yapmanızı sağlar. En basit durum:

>>> '{message: <16}'.format(message='Hi')
'Hi             '

16Değişken olarak geçmek istiyorsanız :

>>> '{message: <{width}}'.format(message='Hi', width=16)
'Hi              '

Tüm kit ve kaboodle için değişkenleri geçmek istiyorsanız :

'{message:{fill}{align}{width}}'.format(
   message='Hi',
   fill=' ',
   align='<',
   width=16,
)

Hangi sonuçlar (tahmin ettiniz):

'Hi              '

Mesajı değiştirmeyi de nasıl başardınız? msgs = ['merhaba', 'merhaba', 'ciao']
ak_slick

1
@ak_slick Biçim işlevine sabit kodlanmış değerler yerine değişkenler iletebilirsiniz.
CivFan

80

Bunu deneyebilirsiniz:

print "'%-100s'" % 'hi'

""% -6s ""% 'merhaba' yazdır !!
konik

8
@simon birisi bir python2.5 sistemi üzerinde sıkışmış olarak bu cevap bana yardımcı oldu, yararsız bir cevap +1
sunshinekitty

18

3
Bu yaygın printf sözdizimini çok daha iyi seviyorum. Sayısız birleşim olmadan karmaşık dizeler yazmanıza olanak sağlar.
Max Tsepkov

4
Bütünlüğü sağlamak için, "'%+100s'" % 'hi'sağındaki boşlukları koymak için çalışacak'hi'
Eric Blum

62

Bunu yapmanın doğru yolu, Python'un biçim sözdizimini resmi belgelerde açıklandığı gibi kullanmak olacaktır.

Bu durumda sadece şöyle olur:
'{:10}'.format('hi')
hangi çıktılar:
'hi '

Açıklama:

format_spec ::=  [[fill]align][sign][#][0][width][,][.precision][type]
fill        ::=  <any character>
align       ::=  "<" | ">" | "=" | "^"
sign        ::=  "+" | "-" | " "
width       ::=  integer
precision   ::=  integer
type        ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

Bilmeniz gereken hemen hemen hepsi orada ^.

Güncelleme: Python 3.6'dan itibaren gerçek dize enterpolasyonu ile daha da kullanışlı!

foo = 'foobar'
print(f'{foo:10} is great!')
# foobar     is great!


27

Python 3.6'dan itibaren

>>> strng = 'hi'
>>> f'{strng: <10}'

ile değişmez dize enterpolasyon .

Veya, dolgu boyutunuz böyle bir değişkende ise (teşekkürler @Matt M.!):

>>> to_pad = 10
>>> f'{strng: <{to_pad}}'

4
f'{strng: >10}'dizeyi 10 boşluk uzunluğuna kadar doldurmak için. Bu sihir. Ve iyi belgelenmemiş.
Chang Ye

@changye Bunun da varsayılan davranışı olduğuna inanıyorum f'{strng:10}'.
WAF

17

ayrıca dizenizi ortalayabilirsiniz :

'{0: ^20}'.format('nice')

7

Dizeler için Python 2.7'nin mini biçimlendirmesini kullanın :

'{0: <8}'.format('123')

Bu sol hizalanır ve '' karakteriyle 8 karaktere kadar doldurulur.


4
@simon zaten bu cevabı verdi ... neden yinelenen bir cevap gönderiyoruz?
Felix Kling

5
'Yeni yanıtlar gönderildi, yenilemek için tıklayın' düğmesini tıklatmadım ve kaçırdım.
aodj

5

Sadece 0'ı kaldırın, bunun yerine boşluk ekleyeceksiniz:

>>> print  "'%6d'"%4

2

Dilimleme kullanmak daha pitonik olmaz mı?

Örneğin, sağda boşlukları olan bir dizeyi 10 karakter uzunluğa kadar doldurmak için:

>>> x = "string"    
>>> (x + " " * 10)[:10]   
'string    '

Soldaki boşluklarla 15 karakter uzunluğa kadar doldurmak için:

>>> (" " * 15 + x)[-15:]
'         string'

Elbette ne kadar süre ped yapmak istediğinizi bilmenizi gerektirir, ancak başlamakta olduğunuz dizenin uzunluğunu ölçmeyi gerektirmez.


9
Hayır olmazdı.
Çılgın Fizikçi

1
Bunu biraz açıklayabilir misin? Sana inanmıyorum, sadece nedenini anlamak istiyorum.
Zev Chonoles

4
Elbette. En pythonic yolu mümkün olduğunca ev yapımı bir çözüm kullanmak yerine yerleşik işlevlerden birini kullanmak olacaktır.
Deli Fizikçi

Eğer söyleyerek gibi inşa fonksiyonları kullanmanız gereken çünkü o dilimleme söyleyerek az pythonic olduğu @MadPhysicist ''.join(reversed(str))daha pythonic olduğunu str[::-1]ve biz doğru değil bütün biliyorum.
Nick

@NickA. Bu çok iyi bir benzetme değil. Örnek olarak kullandığınız durum oldukça geçerlidir. Ancak, (x + " " * 10)[:10]bence kullanmaktan çok daha kıvrımlı x.ljust(10).
Mad Physicist

0

Çeşitli baskı biçimlerinin yerine kullanmak için güzel bir numara:

(1) Sağda boşluk olan ped:

('hi' + '        ')[:8]

(2) Solda önde sıfır bulunan ped:

('0000' + str(2))[-4:]

1
Nedense bu en komik cevap ama hoşuma gitti. Bu çizgiler boyunca şunları da göz önünde bulundurun: min_len = 8o zaman ('hi' + ' '*min_len)[:min_len]veya('0'*min_len + str(2))[-min_len]
Poikilos

1
Numara için, bu ('0'*min_len + str(2))[-min_len:]sadece eğlence için olsa da , daha iyi olurdu ve diğer cevapları tavsiye ederim.
Poikilos

-1

Liste kavrayışını kullanarak bunu yapabilirsiniz, bu size alanların sayısı hakkında bir fikir verecektir ve tek bir astar olacaktır.

"hello" + " ".join([" " for x in range(1,10)])
output --> 'hello                 '

... ve sonra 22 (len ("merhaba") + 17 :() karakter uzunluğunda bir dize alırsınız - bu iyi gitmedi. Komik olurken yapabiliriz s = "hi"; s + (6-len(s)) * " "bunun yerine (ne zaman tamam Ancak sonuç, sorunu çözen herhangi bir çerçeve özelliğini kullanan cevapların bakımı daha kolay olacaktır (diğer yanıtlara bakın)
Poikilos
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.