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.


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        '

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!'

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              '

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'

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!


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}}'

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')

7

Gunakan format mini Python 2.7 untuk string :

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

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


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

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.


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:]

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                 '

... 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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.