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.