ChatGPT解决这个技术问题 Extra ChatGPT

如何用空格填写 Python 字符串?

我想用空格填写一个字符串。我知道以下适用于零:

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

但是当我想要这个时我应该怎么做?:

'hi    '

当然我可以测量字符串长度并执行str+" "*leftover,但我想要最短的方法。

我知道它将来可能会被弃用,但我仍然喜欢这个很好的旧方法:"%-6s" % s 用于左对齐,"%6s" % s 用于右对齐。

F
Felix Kling

您可以使用 str.ljust(width[, fillchar]) 执行此操作:

返回在长度宽度的字符串中左对齐的字符串。使用指定的填充字符(默认为空格)完成填充。如果宽度小于 len(s),则返回原始字符串。

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

@simon 的答案在格式化更复杂的字符串时更灵活、更有用
或 @abbot 的,如果你坚持支持旧版本的 python
ljust() 现在已弃用。请参阅 stackoverflow.com/questions/14776788/… 了解正确的操作方法
它在python 3中消失了吗?只是想添加还有 rjust 和 center ,它们的工作方式大致相同,但用于不同的对齐方式
ljust(), rjust() 仅在字符串模块中被弃用。它们在 str 内置类型上可用。
N
Neuron

对于即使在格式化复杂字符串时也能工作的灵活方法,您可能应该使用 string-formatting mini-language

使用任一 f-strings

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

str.format() 方法

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

如果变量中有“16”怎么办?
当我使用民族口音时,我遇到了这种格式的问题。您可能希望“kra”和“krá”相同,但事实并非如此。
@兰迪'{message: <{fill}}'.format(message='Hi', fill='16')
不要将 str.format() 用于只有一个 {...} 而没有其他内容的模板。只需使用 format() 函数并为自己节省解析开销:format('Hi', '<16')
@aaaaaa 可读性是主观的。我非常喜欢这个答案,它非常简洁明了。
C
CivFan

new(ish) string format method 让您可以使用嵌套的关键字参数做一些有趣的事情。最简单的情况:

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

如果您想将 16 作为变量传递:

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

如果您想为 whole kit and kaboodle 传递变量:

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

结果(你猜对了):

'Hi              '

对于所有这些,您可以使用 python 3.6+ f-strings

message = 'Hi'
fill = ' '
align = '<'
width = 16
f'{message:{fill}{align}{width}}'

当然还有结果:

'Hi              '

您将如何处理不同的消息? msgs = ['嗨','你好','ciao']
@ak_slick 您可以将变量而不是硬编码值传递给格式函数。
a
abbot

你可以试试这个:

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

print "'%-6s'" % 'hi' 确实!!
@simon 作为一个困在 python2.5 系统上的人,这个答案帮助了我,而不是一个无用的答案 +1
在 3.3+ 中不再被弃用
我更喜欢这种常见的 printf 语法。允许您编写复杂的字符串而无需无数次连接。
为了完整起见,"'%+100s'" % 'hi' 可用于在 'hi' 的右侧放置空格
A
Azat Ibrakov

执行此操作的正确方法是使用 the official documentation 中所述的 Python 格式语法

对于这种情况,它只是:
'{: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" | "%"

你需要知道的几乎都在那里^。

更新:从 python 3.6 开始,使用文字字符串插值更加方便!

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

j
johnsyweb

使用 str.ljust()

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

您还应该考虑使用 string.zfill()str.ljust()str.center() 进行字符串格式化。这些可以链接并指定'fill'字符,因此:

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

这些 string formatting operations 具有在 Python v2 和 v3 中工作的优势。

有时间看看pydoc str:里面有很多好东西。


感谢您指出 str.center(n) 方法。这正是我正在寻找的东西,甚至不知道它的存在。 :D
W
WAF

从 Python 3.6 开始,您可以这样做

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

literal string interpolation

或者,如果您的填充大小在一个变量中,像这样(感谢@Matt M.!):

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

f'{strng: >10}' 用于用前导空格填充字符串,长度为 10。这很神奇。它没有很好的记录。
@changye 我相信这也是 f'{strng:10}' 的默认行为。
R
Remi

您还可以将字符串居中:

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

K
K.Mat

TL;博士

text = 'hi'
print(f'{text:10}') # 'hi        '

更长的解释

Python3.6 开始,您可以使用 f 字符串 literal interpolation

可变空间:

value = 4
space = 10

# move value to left
print(f'foo {value:<{space}} bar') # foo 4          bar
# move value to right
print(f'foo {value:>{space}} bar') # foo          4 bar
# center value
print(f'foo {value:^{space}} bar') # foo     4      bar

常数空间:

value = 4

# move value to left
print(f'foo {value:<10} bar') # foo 4          bar
# move value to right
print(f'foo {value:>10} bar') # foo          4 bar
# center value
print(f'foo {value:^10} bar') # foo     4      bar

如果您想用其他字符填充空格,请在开头指定它:

value = 4
space = 10
padd = '_'

print(f'foo {value:{padd}^{space}} bar') # foo ____4_____ bar
print(f'foo {value:_^10} bar')           # foo ____4_____ bar

今天,这应该优于其他方法。
a
aodj

使用 Python 2.7 的 mini formatting for strings

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

这左对齐,并用 ' ' 字符填充到 8 个字符。


@simon 已经给出了这个答案......为什么要发布重复的答案?
我没有点击“新回复已发布,点击刷新”,所以错过了。
e
eldarerathis

只需删除 0 ,它将添加空间:

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

Z
Zev Chonoles

使用切片不是更pythonic吗?

例如,要在右边用空格填充一个字符串,直到它长 10 个字符:

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

要在左边用空格填充它,直到它有 15 个字符长:

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

当然,它需要知道你想要填充多长时间,但它不需要测量你开始的字符串的长度。


你能详细说明一下吗?不是我不相信你,我只是想明白为什么。
当然。最 Pythonic 的方法是使用内置函数之一,而不是尽可能多地使用本土解决方案。
@MadPhysicist 说切片不像 Python 那样,因为你应该在内置函数中使用就像说 ''.join(reversed(str))str[::-1] 更像 Python,我们都知道这不是真的。
@尼克A。这不是一个很好的类比。您作为示例使用的案例非常有效。但是,在我看来,(x + " " * 10)[:10] 比使用 x.ljust(10) 复杂得多。
@MadPhysicist我的意思是您的评论“最pythonic的方法是使用内置函数之一”并不总是准确的,而且它们不是可以生活的词。虽然在这种情况下它肯定是。
E
Erik Anderson

一个很好的技巧来代替各种打印格式:

(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:],尽管这只是为了好玩,我推荐其他答案。
f
foobar666

您可以使用列表理解来做到这一点,这也可以让您了解空格的数量,并且将是一个单行。

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

...然后你得到一个 22 (len("hello")+17 :( ) 个字符长的字符串——这并不顺利。虽然我们很有趣,但我们可以做 s = "hi" ; s + (6-len(s)) * " "相反(当结果是否定的时候没关系)。但是,使用解决确切问题的任何框架功能的答案将更容易维护(请参阅其他答案)。
不回答问题,由于 str 长度不同,所需的空间量是未知的。