Câu trả lời:
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 '
Đố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!'
'{message: <{fill}}'.format(message='Hi', fill='16')
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')
.
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 16
như 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 '
Bạn có thể thử điều này:
print "'%-100s'" % 'hi'
"'%+100s'" % 'hi'
sẽ hoạt động để đặt khoảng trắng ở bên phải'hi'
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!
Sử dụng str.ljust()
:
>>> 'Hi'.ljust(6)
'Hi '
Bạn cũng nên cân nhắc string.zfill()
, str.ljust()
và 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 str
Thỉnh thoảng hãy xem : có rất nhiều thứ tốt trong đó.
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}}'
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.
f'{strng:10}'
.
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ự ''.
Chỉ cần xóa 0 và nó sẽ thêm không gian thay thế:
>>> print "'%6d'"%4
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.
''.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.
(x + " " * 10)[:10]
theo tôi là phức tạp hơn nhiều so với sử dụng x.ljust(10)
.
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:]
min_len = 8
sau đó ('hi' + ' '*min_len)[:min_len]
hoặc('0'*min_len + str(2))[-min_len]
('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.
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 '
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).
"%-6s" % s
cho căn lề trái và căn"%6s" % s
phải.