【问题标题】:How can I fill out a Python string with spaces?如何用空格填写 Python 字符串?
【发布时间】:2011-08-06 07:21:42
【问题描述】:

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

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

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

'hi    '

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

【问题讨论】:

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

标签: python string string-formatting pad


【解决方案1】:

由于Python3.6,您可以使用f-strings 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

【讨论】:

  • 今天,这应该优于其他方法。
【解决方案2】:

新的(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 = ['hi', 'hello', 'ciao']
  • @ak_slick 您可以将变量而不是硬编码值传递给格式函数。
【解决方案3】:

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

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

f-strings

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

【讨论】:

  • 如果变量中有 '16' 怎么办?
  • 我也想通了。应该贴出来的。文档说这应该适用于 Py2.6,但我的发现并非如此。不过可以在 Py2.7 中使用。
  • 我在使用国家口音时遇到了这种格式的问题。您可能希望 'kra' 和 'krá' 相同,但事实并非如此。
  • @Randy '{message: &lt;{fill}}'.format(message='Hi', fill='16')
  • 不要将str.format() 用于只有一个{...} 而没有其他内容的模板。只需使用format() 函数并节省解析开销:format('Hi', '&lt;16')
【解决方案4】:

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

(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:],虽然这只是为了好玩,我推荐其他答案。
【解决方案5】:

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

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

【讨论】:

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

正确的做法是使用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!

【讨论】:

    【解决方案7】:

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

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

    literal string interpolation

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

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

    【讨论】:

    • f'{strng: &gt;10}' 用于将前导空格填充到长度为 10 的字符串。这很神奇。而且没有很好的记录。
    • @changye 我相信这也是f'{strng:10}'的默认行为。
    【解决方案8】:

    使用切片不是更pythonic吗?

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

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

    用左边的空格填充它直到它的长度为 15 个字符:

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

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

    【讨论】:

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

    只需删除 0,它就会添加空格:

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

    【讨论】:

      【解决方案10】:

      使用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
      【解决方案11】:

      你也可以居中你的字符串:

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

      【讨论】:

        【解决方案12】:

        使用 Python 2.7 的 mini formatting for strings:

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

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

        【讨论】:

        • @simon 已经给出了这个答案...为什么要发布重复的答案?
        • 我没有点击“新回复已发布,点击刷新”,所以错过了。
        【解决方案13】:

        您可以使用str.ljust(width[, fillchar])

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

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

        【讨论】:

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

        你可以试试这个:

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

        【讨论】:

        • print "'%-6s'" % 'hi' 确实!!
        • @simon 因为有人卡在 python2.5 系统上,这个答案帮助了我,而不是无用的答案 +1
        • 在 3.3+ 中不再被弃用
        • 我更喜欢这种常见的 printf 语法。允许您编写复杂的字符串而无需无数连接。
        • 为了完整起见,"'%+100s'" % 'hi' 可以将空格放在'hi' 的右侧
        猜你喜欢
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-17
        • 1970-01-01
        • 2021-05-11
        相关资源
        最近更新 更多