Bagaimana saya bisa mengisi string Python dengan spasi?

509

Saya ingin mengisi string dengan spasi. Saya tahu bahwa yang berikut ini berfungsi untuk nol:

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

Tetapi apa yang harus saya lakukan ketika saya menginginkan ini ?:

'hi    '

tentu saja saya bisa mengukur panjang string dan melakukan str+" "*leftover, tetapi saya ingin cara terpendek.

lancip
sumber
1
Saya tahu ini mungkin sudah usang di masa depan, tapi saya masih suka metode lama yang bagus ini: "%-6s" % suntuk rata kiri dan "%6s" % skanan kanan.
Basj

Jawaban:

700

Anda dapat melakukan ini dengan str.ljust(width[, fillchar]):

Kembalikan string yang dibenarkan dalam string dengan panjang lebar . Padding dilakukan menggunakan fillchar yang ditentukan (default adalah spasi). String asli dikembalikan jika lebarnya kurang dari len(s).

>>> 'hi'.ljust(10)
'hi        '
Felix Kling
sumber
18
Jawaban @simon lebih fleksibel dan lebih berguna ketika memformat string yang lebih kompleks
CoatedMoose
3
atau @abbot jika Anda mandek mendukung versi lama python
CoatedMoose
1
ljust () sekarang sudah usang. Lihat stackoverflow.com/questions/14776788/... untuk cara yang benar untuk melakukannya
Mawg mengatakan mengembalikan Monica
Sudah tidak ada di python 3? Hanya ingin menambahkan ada juga rjust dan center yang bekerja dengan cara yang sama tetapi untuk keberpihakan yang berbeda
radtek
17
ljust (), rjust () telah ditinggalkan hanya dari modul string. Mereka tersedia pada tipe str builtin.
Rohan Grover
374

Untuk metode fleksibel yang berfungsi bahkan ketika memformat string yang rumit, Anda mungkin harus menggunakan bahasa mini pemformatan string , menggunakan salah satu str.format()metode

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

dari f-string

>>> f'{"Hi": <16} StackOverflow!'  # Python >= 3.6
'Hi               StackOverflow!'
simon
sumber
11
Bagaimana jika Anda memiliki '16' dalam suatu variabel?
Randy
Saya juga mengetahuinya. Seharusnya mempostingnya. Dokumen mengatakan ini harus bekerja untuk Py2.6, tetapi temuan saya sebaliknya. Bekerja di Py2.7.
Randy
1
Saya memiliki masalah dengan pemformatan jenis ini ketika saya menggunakan aksen nasional. Anda ingin 'kra' dan 'krá' sama, tetapi ternyata tidak.
quapka
77
@Randy'{message: <{fill}}'.format(message='Hi', fill='16')
CivFan
19
Jangan gunakan str.format()untuk templat dengan hanya satu {...}dan tidak ada yang lain. Hanya menggunakan format()fungsi dan menyelamatkan diri parsing overhead: format('Hi', '<16').
Martijn Pieters
119

Metode format string baru (ish) memungkinkan Anda melakukan beberapa hal menyenangkan dengan argumen kata kunci bersarang. Kasus paling sederhana:

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

Jika Anda ingin meneruskan 16sebagai variabel:

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

Jika Anda ingin memasukkan variabel untuk keseluruhan kit dan kaboodle :

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

Yang menghasilkan (Anda dapat menebaknya):

'Hi              '
CivFan
sumber
Bagaimana Anda menangani berbagai pesan juga? msgs = ['hi', 'hello', 'ciao']
ak_slick
1
@ak_slick Anda dapat mengirimkan variabel alih-alih nilai yang dikodekan ke dalam fungsi format.
CivFan
80

Anda dapat mencoba ini:

print "'%-100s'" % 'hi'
kepala biara
sumber
cetak "'% -6s'"% 'hai memang !!
lancip
8
@simon ketika seseorang terjebak pada sistem python2.5 jawaban ini membantu saya, bukan jawaban yang tidak berguna +1
sunshinekitty
18
Tidak ditinggalkan lagi di 3.3+
Seppo Erviälä
3
Saya suka sintaks printf umum ini jauh lebih baik. Memungkinkan Anda menulis string yang rumit tanpa gabungan yang tak terhitung jumlahnya.
Max Tsepkov
4
Untuk kelengkapan, "'%+100s'" % 'hi'akan bekerja untuk menempatkan ruang di sebelah kanan'hi'
Eric Blum
63

Cara yang benar untuk melakukan ini adalah dengan menggunakan sintaks format Python seperti yang dijelaskan dalam dokumentasi resmi

Untuk kasus ini, ia hanya akan:
'{:10}'.format('hi')
output mana:
'hi '

Penjelasan:

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" | "%"

Cukup banyak yang perlu Anda ketahui ada di sana ^.

Pembaruan: pada python 3.6 bahkan lebih nyaman dengan interpolasi string literal!

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

Gunakan str.ljust():

>>> 'Hi'.ljust(6)
'Hi    '

Anda juga harus mempertimbangkan string.zfill(), str.ljust()dan str.center()untuk memformat string. Ini dapat dirantai dan memiliki karakter ' isi ' yang ditentukan, dengan demikian:

>>> ('3'.zfill(8) + 'blind'.rjust(8) + 'mice'.ljust(8, '.')).center(40)
'        00000003   blindmice....        '

Operasi pemformatan string ini memiliki keuntungan bekerja di Python v2 dan v3.

Lihatlah pydoc strkapan-kapan: ada banyak barang bagus di sana.

Johnsyweb
sumber
27

Pada Python 3.6 Anda bisa melakukannya

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

dengan interpolasi string literal .

Atau, jika ukuran lapisan dalam variabel, seperti ini (terima kasih @Matt M.!):

>>> to_pad = 10
>>> f'{strng: <{to_pad}}'
WAF
sumber
4
f'{strng: >10}'untuk mengisi string dengan spasi putih terdepan hingga 10. Itu sihir. Dan itu tidak didokumentasikan dengan baik.
Chang Ye
@ changye Saya percaya ini juga merupakan perilaku default f'{strng:10}'.
WAF
17

Anda juga dapat memusatkan string Anda:

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

Gunakan format mini Python 2.7 untuk string :

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

Ini menyejajarkan kiri, dan bantalan untuk 8 karakter dengan karakter ''.

aodj
sumber
4
@simon sudah memberikan jawaban ini ... mengapa mengirim jawaban rangkap?
Felix Kling
5
Saya tidak mengeklik 'tanggapan baru telah diposkan, klik untuk menyegarkan' dan sangat ketinggalan.
aodj
5

Hapus saja 0 dan itu akan menambah ruang sebagai gantinya:

>>> print  "'%6d'"%4
Amir Mofakhar
sumber
2

Bukankah lebih pythonic untuk menggunakan slicing?

Misalnya, untuk memasang string dengan spasi di sebelah kanan hingga panjangnya 10 karakter:

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

Untuk menambahkannya dengan spasi di sebelah kiri hingga 15 karakter:

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

Ini membutuhkan mengetahui berapa lama Anda ingin pad, tentu saja, tetapi tidak perlu mengukur panjang string yang Anda mulai.

Zev Chonoles
sumber
9
Tidak, itu tidak akan terjadi.
Fisikawan Gila
1
Dapatkah Anda menguraikan itu? Bukannya aku tidak percaya padamu, aku hanya ingin mengerti alasannya.
Zev Chonoles
4
Tentu. Cara paling pythonic adalah menggunakan salah satu fungsi builtin daripada menggunakan solusi homegrown sebanyak mungkin.
Fisikawan Gila
@MadPhysicist mengatakan bahwa mengiris adalah kurang pythonic karena Anda harus menggunakan fungsi yang dibangun adalah seperti mengatakan ''.join(reversed(str))lebih pythonic daripada str[::-1], dan kita semua tahu itu tidak benar.
Nick
@NickA. Itu bukan analogi yang sangat bagus. Kasing yang Anda gunakan sebagai contoh cukup valid. Namun, (x + " " * 10)[:10]menurut saya jauh lebih berbelit daripada menggunakan x.ljust(10).
Fisikawan Gila
0

Trik yang bagus untuk digunakan sebagai ganti berbagai format cetak:

(1) Pad dengan spasi di sebelah kanan:

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

(2) Pad dengan angka nol di sebelah kiri:

('0000' + str(2))[-4:]
Erik Anderson
sumber
1
Untuk beberapa alasan ini adalah jawaban paling lucu tapi saya suka itu. Di sepanjang garis itu juga mempertimbangkan: min_len = 8lalu ('hi' + ' '*min_len)[:min_len]atau('0'*min_len + str(2))[-min_len]
Poikilos
1
Untuk jumlahnya, akan lebih ('0'*min_len + str(2))[-min_len:]baik, meskipun ini hanya untuk bersenang-senang, dan saya merekomendasikan jawaban lain.
Poikilos
-1

Anda bisa melakukannya menggunakan pemahaman daftar, ini akan memberi Anda gambaran tentang jumlah spasi juga dan akan menjadi satu liner.

"hello" + " ".join([" " for x in range(1,10)])
output --> 'hello                 '
foobar666
sumber
... dan kemudian Anda mendapatkan string yang panjangnya 22 (len ("hello") + 17 :() karakter - itu tidak berjalan dengan baik. Sementara kami lucu, kami bisa melakukannya s = "hi"; s + (6-len(s)) * " "sebaliknya (tidak apa-apa ketika hasilnya negatif) .Namun, jawaban yang menggunakan fitur kerangka apa pun yang mengatasi masalah pasti akan lebih mudah dipertahankan (lihat jawaban lain)
Poikilos