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.