ฉันต้องการกรอกสตริงด้วยช่องว่าง ฉันรู้ว่างานต่อไปนี้เป็นศูนย์
>>> print "'%06d'"%4
'000004'
แต่ฉันควรทำอย่างไรเมื่อฉันต้องการสิ่งนี้:
'hi '
แน่นอนฉันสามารถวัดความยาวสตริงและทำstr+" "*leftover
แต่ฉันต้องการวิธีที่สั้นที่สุด
ฉันต้องการกรอกสตริงด้วยช่องว่าง ฉันรู้ว่างานต่อไปนี้เป็นศูนย์
>>> print "'%06d'"%4
'000004'
แต่ฉันควรทำอย่างไรเมื่อฉันต้องการสิ่งนี้:
'hi '
แน่นอนฉันสามารถวัดความยาวสตริงและทำstr+" "*leftover
แต่ฉันต้องการวิธีที่สั้นที่สุด
คำตอบ:
คุณสามารถทำได้ด้วยstr.ljust(width[, fillchar])
:
กลับสตริงซ้ายธรรมในสายของความยาวความกว้าง การเติมเต็มทำได้โดยใช้fillchar ที่ระบุ(ค่าดีฟอลต์คือช่องว่าง) สตริงเดิมถูกส่งกลับถ้าความกว้าง
len(s)
น้อยกว่า
>>> 'hi'.ljust(10)
'hi '
สำหรับวิธีการที่ยืดหยุ่นที่ใช้งานได้แม้ในการจัดรูปแบบสตริงที่ซับซ้อนคุณอาจใช้การจัดรูปแบบสตริงขนาดเล็กโดยใช้วิธีใดstr.format()
วิธีหนึ่ง
>>> '{0: <16} StackOverflow!'.format('Hi') # Python >=2.6
'Hi StackOverflow!'
ของf- สตริง
>>> f'{"Hi": <16} StackOverflow!' # Python >= 3.6
'Hi StackOverflow!'
'{message: <{fill}}'.format(message='Hi', fill='16')
str.format()
สำหรับเทมเพลตที่มีเพียงอันเดียว{...}
และไม่มีอะไรอื่น เพียงแค่ใช้ฟังก์ชั่นและบันทึกตัวเองแยกค่าใช้จ่าย:format()
format('Hi', '<16')
วิธีการจัดรูปแบบสตริงใหม่ (ish) ช่วยให้คุณทำเรื่องสนุก ๆ ด้วยอาร์กิวเมนต์คำหลักที่ซ้อนกัน กรณีที่ง่ายที่สุด:
>>> '{message: <16}'.format(message='Hi')
'Hi '
หากคุณต้องการส่งผ่าน16
เป็นตัวแปร:
>>> '{message: <{width}}'.format(message='Hi', width=16)
'Hi '
หากคุณต้องการส่งผ่านตัวแปรสำหรับชุดและ kaboodle ทั้งหมด :
'{message:{fill}{align}{width}}'.format(
message='Hi',
fill=' ',
align='<',
width=16,
)
ผลลัพธ์ใด (คุณเดาได้):
'Hi '
คุณสามารถลองสิ่งนี้:
print "'%-100s'" % 'hi'
"'%+100s'" % 'hi'
จะใช้เพื่อวางช่องว่างทางด้านขวาของ'hi'
วิธีที่ถูกต้องในการทำเช่นนี้คือการใช้รูปแบบไวยากรณ์ของงูใหญ่ตามที่อธิบายไว้ในเอกสารประกอบอย่างเป็นทางการ
สำหรับกรณีนี้มันจะเป็นเพียงแค่:
'{:10}'.format('hi')
ผลลัพธ์ที่:
'hi '
คำอธิบาย:
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" | "%"
ค่อนข้างทุกสิ่งที่คุณต้องรู้มี ^.
Update: ตั้งแต่ python 3.6 สะดวกยิ่งขึ้นด้วยการแก้ไขสตริงตามตัวอักษร!
foo = 'foobar'
print(f'{foo:10} is great!')
# foobar is great!
การใช้str.ljust()
:
>>> 'Hi'.ljust(6)
'Hi '
นอกจากนี้คุณยังควรพิจารณาstring.zfill()
, str.ljust()
และstr.center()
สำหรับการจัดรูปแบบสตริง สิ่งเหล่านี้สามารถถูกล่ามโซ่และมีการระบุอักขระ ' เติม ' ดังนี้
>>> ('3'.zfill(8) + 'blind'.rjust(8) + 'mice'.ljust(8, '.')).center(40)
' 00000003 blindmice.... '
การดำเนินการจัดรูปแบบสตริงเหล่านี้มีข้อดีของการทำงานใน Python v2 และ v3
ลองดูpydoc str
บางครั้ง: มีสิ่งดีๆมากมายอยู่ในนั้น
จาก Python 3.6 คุณสามารถทำได้
>>> strng = 'hi'
>>> f'{strng: <10}'
หรือหากขนาดการเติมเต็มของคุณอยู่ในตัวแปรเช่นนี้ (ขอบคุณ @Matt M. !):
>>> to_pad = 10
>>> f'{strng: <{to_pad}}'
f'{strng: >10}'
สำหรับการเติมสตริงด้วยช่องว่างนำไปสู่ความยาว 10 นั่นคือเวทย์มนตร์ และมันก็ไม่ได้บันทึกไว้อย่างดี
f'{strng:10}'
ผมเชื่อว่านี่ยังเป็นพฤติกรรมที่เริ่มต้นของ
คุณยังสามารถจัดสายให้อยู่กึ่งกลาง :
'{0: ^20}'.format('nice')
ใช้การจัดรูปแบบมินิของ Python 2.7 สำหรับสตริง :
'{0: <8}'.format('123')
สิ่งนี้จัดชิดซ้ายและวางได้ถึง 8 อักขระด้วยอักขระ ''
เพียงแค่ลบ 0 และมันจะเพิ่มพื้นที่ว่างแทน:
>>> print "'%6d'"%4
การใช้ตัวแบ่งส่วนข้อมูลจะเป็นแบบ pythonic มากกว่านี้หรือไม่
ตัวอย่างเช่นหากต้องการรองสตริงด้วยช่องว่างทางด้านขวาจนกระทั่งมีความยาว 10 อักขระ:
>>> x = "string"
>>> (x + " " * 10)[:10]
'string '
หากต้องการรองด้วยช่องว่างทางด้านซ้ายจนกระทั่งมีความยาว 15 อักขระ:
>>> (" " * 15 + x)[-15:]
' string'
แน่นอนว่าคุณต้องรู้ระยะเวลาที่คุณต้องการแพด แต่ไม่จำเป็นต้องวัดความยาวของสตริงที่คุณเริ่มต้นด้วย
''.join(reversed(str))
เป็น pythonic มากกว่าstr[::-1]
และเราทุกคนรู้ว่ามันไม่เป็นความจริง
(x + " " * 10)[:10]
x.ljust(10)
เคล็ดลับที่ดีที่จะใช้แทนรูปแบบการพิมพ์ต่างๆ:
(1) แผ่นที่มีช่องว่างทางด้านขวา:
('hi' + ' ')[:8]
(2) แผ่นที่มีศูนย์นำหน้าทางซ้าย:
('0000' + str(2))[-4:]
min_len = 8
ถ้าอย่างนั้น('hi' + ' '*min_len)[:min_len]
หรือ('0'*min_len + str(2))[-min_len]
('0'*min_len + str(2))[-min_len:]
ค่อนข้างแม้ว่าจะเป็นเพียงเพื่อความสนุกสนานและฉันขอแนะนำคำตอบอื่น ๆ
คุณสามารถทำได้โดยใช้ list comprehension นี่จะทำให้คุณมีความคิดเกี่ยวกับจำนวนของช่องว่างเช่นกันและจะเป็นหนึ่งซับ
"hello" + " ".join([" " for x in range(1,10)])
output --> 'hello '
s = "hi"
; s + (6-len(s)) * " "
แทน (มันก็โอเคเมื่อ ผลลัพธ์จะเป็นค่าลบ) อย่างไรก็ตามคำตอบที่ใช้คุณลักษณะเฟรมเวิร์กที่แก้ไขปัญหาที่แน่นอนจะง่ายต่อการดูแลรักษา (ดูคำตอบอื่น ๆ )
"%-6s" % s
สำหรับการจัดชิดซ้ายและการจัดชิด"%6s" % s
ขวา