Làm thế nào tôi có thể điền vào một chuỗi Python có khoảng trắng?


509

Tôi muốn điền vào một chuỗi với khoảng trắng. Tôi biết rằng các công việc sau đây cho zero's:

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

Nhưng tôi nên làm gì khi tôi muốn điều này?:

'hi    '

tất nhiên tôi có thể đo chiều dài chuỗi và làm str+" "*leftover, nhưng tôi muốn cách ngắn nhất.


1
Tôi biết nó có thể bị phản đối trong tương lai, nhưng tôi vẫn thích phương pháp cũ tốt này: "%-6s" % scho căn lề trái và căn "%6s" % sphải.
Basj

Câu trả lời:


700

Bạn có thể làm điều này với str.ljust(width[, fillchar]):

Trả về chuỗi trái được chứng minh trong một chuỗi có chiều rộng . Việc đệm được thực hiện bằng cách sử dụng fillar đã chỉ định (mặc định là khoảng trắng ). Chuỗi ban đầu được trả về nếu chiều rộng nhỏ hơn len(s).

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

18
Câu trả lời của @simon linh hoạt hơn và hữu ích hơn khi định dạng các chuỗi phức tạp hơn
CoatedMoose

3
hoặc @abbot nếu bạn gặp khó khăn khi hỗ trợ các phiên bản cũ của python
CoatedMoose

1
ljust () hiện không được dùng nữa. Xem stackoverflow.com/questions/14776788/ cấp để biết cách thực hiện chính xác
Mawg nói rằng phục hồi Monica

Nó đã biến mất trong python 3? Chỉ muốn thêm vào đó cũng là sự bất công và trung tâm hoạt động theo cùng một cách nhưng đối với sự sắp xếp khác nhau
radtek

17
ljust (), rjust () chỉ bị phản đối từ mô-đun chuỗi. Chúng có sẵn trên các loại str dựng.
Rohan Grover

374

Đối với một phương thức linh hoạt hoạt động ngay cả khi định dạng chuỗi phức tạp, có lẽ bạn nên sử dụng ngôn ngữ nhỏ định dạng chuỗi , sử dụng str.format()phương thức này

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

của chuỗi f

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

11
Điều gì nếu bạn có '16' trong một biến?
Randy

Tôi cũng hiểu điều đó. Nên đã đăng nó. Các tài liệu nói rằng điều này sẽ làm việc cho Py2.6, nhưng những phát hiện của tôi thì khác. Hoạt động trong Py2.7 mặc dù.
Randy

1
Tôi gặp vấn đề với loại định dạng này khi tôi đang sử dụng giọng quốc gia. Bạn sẽ muốn 'kra' và 'krá' giống nhau, nhưng họ thì không.
quapka

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

19
Đừng sử dụng str.format()cho các mẫu chỉ có một {...}và không có gì khác. Chỉ cần sử dụng format()chức năng và tiết kiệm cho mình chi phí phân tích cú pháp : format('Hi', '<16').
Martijn Pieters

119

Phương thức định dạng chuỗi (ish) mới cho phép bạn thực hiện một số nội dung thú vị với các đối số từ khóa lồng nhau. Trường hợp đơn giản nhất:

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

Nếu bạn muốn truyền vào 16như một biến:

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

Nếu bạn muốn chuyển các biến cho toàn bộ kit và kaboodle :

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

Kết quả nào (bạn đoán được):

'Hi              '

Làm thế nào bạn sẽ xử lý thay đổi tin nhắn là tốt? tin nhắn = ['hi', 'xin chào', 'ciao']
ak_slick

1
@ak_slick Bạn có thể chuyển các biến thay vì các giá trị được mã hóa cứng vào hàm định dạng.
CivilFan

80

Bạn có thể thử điều này:

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

thực sự in "'% -6s" "%' hi '!!
côn

8
@simon như một người nào đó bị mắc kẹt trên một hệ thống python2.5 câu trả lời này đã giúp tôi, không phải là một câu trả lời vô ích 1
sunshinekitty

18
Không được phản đối nữa trong 3.3+
Seppo Erviälä 16/2/2015

3
Tôi thích cú pháp printf phổ biến này tốt hơn nhiều. Cho phép bạn viết các chuỗi phức tạp mà không cần vô số phép nối.
Max Tsepkov

4
Để hoàn thiện, "'%+100s'" % 'hi'sẽ hoạt động để đặt khoảng trắng ở bên phải'hi'
Eric Blum

63

Cách chính xác để làm điều này sẽ là sử dụng cú pháp định dạng của Python như được mô tả trong tài liệu chính thức

Trong trường hợp này, nó chỉ đơn giản là:
'{:10}'.format('hi')
đầu ra nào:
'hi '

Giải trình:

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

Khá nhiều tất cả những gì bạn cần biết là ở đó ^.

Cập nhật: kể từ python 3.6, nó thậm chí còn thuận tiện hơn với phép nội suy chuỗi ký tự!

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

37

Sử dụng str.ljust():

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

Bạn cũng nên cân nhắc string.zfill(), str.ljust()str.center()để định dạng chuỗi. Chúng có thể được xâu chuỗi và có ký tự ' điền ' được chỉ định, do đó:

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

Các hoạt động định dạng chuỗi này có lợi thế làm việc trong Python v2 và v3.

pydoc strThỉnh thoảng hãy xem : có rất nhiều thứ tốt trong đó.


27

Kể từ Python 3.6, bạn có thể làm

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

với phép nội suy chuỗi ký tự .

Hoặc, nếu kích thước phần đệm của bạn là một biến, như thế này (cảm ơn @Matt M.!):

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

4
f'{strng: >10}'để điền chuỗi với khoảng trắng hàng đầu đến độ dài 10. Đó là phép thuật. Và nó không phải là tài liệu tốt.
Chang Ye

@changye Tôi tin rằng đây cũng là hành vi mặc định của f'{strng:10}'.
WAF

17

bạn cũng có thể căn giữa chuỗi của mình:

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

7

Sử dụng định dạng nhỏ của Python 2.7 cho chuỗi :

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

Điều này trái căn chỉnh, và miếng đệm thành 8 ký tự với ký tự ''.


4
@simon đã đưa ra câu trả lời này ... tại sao lại đăng một câu trả lời trùng lặp?
Felix Kling

5
Tôi đã không nhấp vào 'phản hồi mới đã được đăng, nhấp để làm mới' và vì vậy đã bỏ lỡ nó.
aodj

5

Chỉ cần xóa 0 và nó sẽ thêm không gian thay thế:

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

2

Nó sẽ không được pythonic hơn để sử dụng cắt?

Ví dụ: để đệm một chuỗi có khoảng trắng ở bên phải cho đến khi dài 10 ký tự:

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

Để đệm nó với khoảng trắng ở bên trái cho đến khi dài 15 ký tự:

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

Nó đòi hỏi phải biết bạn muốn đệm trong bao lâu, tất nhiên, nhưng nó không yêu cầu đo độ dài của chuỗi bạn bắt đầu.


9
Không, nó sẽ không.
Nhà vật lý điên

1
bạn có thể giải thích về điều đó không? Không phải là tôi không tin bạn, tôi chỉ muốn hiểu tại sao.
Zev Chonoles

4
Chắc chắn rồi. Cách pythonic nhất sẽ là sử dụng một trong các hàm dựng sẵn thay vì sử dụng giải pháp cây nhà càng nhiều càng tốt.
Nhà vật lý điên

@MadPhysicist nói rằng cắt lát ít pythonic hơn bởi vì bạn nên sử dụng trong các hàm được xây dựng cũng giống như nói ''.join(reversed(str))là nhiều pythonic hơn str[::-1], và tất cả chúng ta đều biết điều đó không đúng.
Nick

@NickA. Đó không phải là một sự tương tự rất tốt. Trường hợp bạn đang sử dụng làm ví dụ là khá hợp lệ. Tuy nhiên, (x + " " * 10)[:10]theo tôi là phức tạp hơn nhiều so với sử dụng x.ljust(10).
Nhà vật lý điên

0

Một mẹo hay để sử dụng thay cho các định dạng in khác nhau:

(1) Pad có khoảng trắng ở bên phải:

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

(2) Pad với các số 0 đứng đầu bên trái:

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

1
Vì một số lý do, đây là câu trả lời hài hước nhất nhưng tôi thích nó. Dọc theo những dòng đó cũng xem xét: min_len = 8sau đó ('hi' + ' '*min_len)[:min_len]hoặc('0'*min_len + str(2))[-min_len]
Poikilos

1
Đối với số, nó sẽ là tốt ('0'*min_len + str(2))[-min_len:]hơn, mặc dù điều này chỉ để cho vui, và tôi đề nghị các câu trả lời khác.
Poikilos

-1

Bạn có thể làm điều đó bằng cách sử dụng tính năng hiểu danh sách, điều này sẽ cung cấp cho bạn một ý tưởng về số lượng khoảng trống và sẽ là một lớp lót.

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

... và sau đó bạn nhận được một chuỗi dài 22 ký tự (len ("xin chào") + 17 :() - điều đó không ổn. Trong khi chúng tôi hài hước, chúng tôi có thể làm được s = "hi"; s + (6-len(s)) * " "thay vào đó (mọi thứ vẫn ổn khi kết quả là âm tính). Tuy nhiên, các câu trả lời sử dụng bất kỳ tính năng khung nào giải quyết vấn đề chính xác sẽ dễ duy trì hơn (xem các câu trả lời khác).
Poikilos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.