如何在 Python 中用空格将字符串填充到固定长度?

Posted

技术标签:

【中文标题】如何在 Python 中用空格将字符串填充到固定长度?【英文标题】:How to pad a string to a fixed length with spaces in Python? 【发布时间】:2013-12-17 00:53:28 【问题描述】:

我确信这在很多地方都有介绍,但我不知道我正在尝试执行的操作的确切名称,因此我无法真正查找它。我已经阅读了 30 分钟的官方 Python 书籍,试图找出如何做到这一点。

问题:我需要在一定长度的“字段”中放入一个字符串。

例如,如果姓名字段有 15 个字符长,而我的名字是 John,我会得到“John”后跟 11 个空格来创建 15 个字符的字段。

我需要它适用于为变量“name”输入的任何字符串。

我知道这可能是某种形式的格式,但我找不到执行此操作的确切方法。帮助将不胜感激。

【问题讨论】:

有一个关于效率的说明。像John 这样的短字符串会被隐藏,但大多数生成的字符串不会,这会导致内存压力增加。如果在紧密循环中使用,或者重复执行以重新对齐相同的字符串。埋葬:name = 'John'; name is 'John' — 未埋葬:":<15".format("John") is not 'John ' 也未埋葬:"John".ljust(15) is not 'John ' & ("John"+" ")[:15] is not 'John ' & name = "John"; while len(name) < 15: name += " " name is not 'John '(假装 html 不会崩溃。;) 【参考方案1】:

您可以使用rjustljust 函数在字符串之前或之后添加特定字符以达到特定长度。 这些方法的第一个参数是字符串转换后的总字符数。

右对齐(添加到左边)

numStr = '69' 
numStr = numStr.rjust(5, '*')

结果是***69

左对齐(添加到右侧)

对于左边:

numStr = '69' 
numStr = numStr.ljust(3, '#')

结果将是69#

用前导零填充

也可以简单地使用添加零:

numstr.zfill(8)

结果是00000069

【讨论】:

【参考方案2】:

我知道这是一个老问题,但我最终为它制作了自己的小班。

可能对某人有用,所以我会坚持下去。我使用了一个本质上是持久的类变量,以确保添加了足够的空白来清除任何旧行。见下文:

2021-03-02 更新:改进了一点 - 在处理大型代码库时,您知道您正在编写的行是否是您关心的行,但您不知道之前写入控制台的内容以及是否要保留它。

此更新解决了这一问题,您在写入控制台时更新的类变量会跟踪您当前正在编写的行是您想要保留的行,还是允许稍后覆盖。

class consolePrinter():
'''
Class to write to the console

Objective is to make it easy to write to console, with user able to 
overwrite previous line (or not)
'''
# -------------------------------------------------------------------------    
#Class variables
stringLen = 0    
overwriteLine = False
# -------------------------------------------------------------------------    
    
# -------------------------------------------------------------------------
def writeline(stringIn, overwriteThisLine=False):
    import sys
    #Get length of stringIn and update stringLen if needed
    if len(stringIn) > consolePrinter.stringLen:
        consolePrinter.stringLen = len(stringIn)+1
    
    ctrlString = ":<"+str(consolePrinter.stringLen)+""

    prevOverwriteLine = consolePrinter.overwriteLine
    if prevOverwriteLine:
        #Previous line entry can be overwritten, so do so
        sys.stdout.write("\r" + ctrlString.format(stringIn))
    else:
        #Previous line entry cannot be overwritten, take a new line
        sys.stdout.write("\n" + stringIn)
    sys.stdout.flush()
    
    #Update the class variable for prevOverwriteLine
    consolePrinter.overwriteLine = overwriteThisLine

    return

然后通过以下方式调用:

consolePrinter.writeline("text here", True) 

如果您希望此行可被覆盖

consolePrinter.writeline("text here",False)

如果你不这样做。

注意,要使其正常工作,所有推送到控制台的消息都需要通过 consolePrinter.writeline。

【讨论】:

【参考方案3】:

如果你有 python 3.6 或更高版本,你可以使用 f 字符串

>>> string = "John"
>>> f"string:<15"
'John           '

或者如果你喜欢它在左边

>>> f"string:>15"
'          John'

居中

>>> f"string:^15"
'     John      '

如需更多变体,请随时查看文档:https://docs.python.org/3/library/string.html#format-string-syntax

【讨论】:

特别棒的是,您还可以轻松插入之前计算的长度:f"string:&lt;calculated_length"!【参考方案4】:

刚刚解决了我的问题,它只是添加了一个空格,直到字符串的长度超过你给它的 min_length。

def format_string(str, min_length):
    while len(str) < min_length:
        str += " "
    return str

【讨论】:

字符串不是 Python 中的数组,它们是不可变的对象。每个附加一个空格都会创建一个全新的字符串,它是前一个字符串,扩展一个空格。然而,需要多次达到目标长度。这是一个高度次优的解决方案,而不是使用提供的实际方法,also given as an answer,它只创建一个新的 Python 字符串对象一次。【参考方案5】:
name = "John" // your variable
result = (name+"               ")[:15] # this adds 15 spaces to the "name"
                                       # but cuts it at 15 characters

【讨论】:

更好的方式:(name+" "*15)[:15] / 最佳方式:ljust(),根据 Ismail 的回答。 你试过这个代码吗?如果你这样做了,你会发现 // 在你使用它时会在 python 中产生名称和/或语法错误。 @SethMMorton 是的,对不起,我后来手动添加了 // cmets,没有进行测试。 @pandubear ljust() 工作得很好,但是我们怎样才能让填充空间直到一个欲望列?【参考方案6】:

format 超级简单:

>>> a = "John"
>>> ":<15".format(a)
'John           '

【讨论】:

@GamesBrainiac format 对于这个简单的案例来说有点矫枉过正,但一旦理解,它就非常强大,值得最初的学习成本!然后+1。 如果文本长度超过 15 个字符,format 不会截断它。为此,请写:':&lt;15'.format(a[:15]) 从 Python 3.6 版开始,您可以使用 f-strings 代替 string.format() f"a:&lt;15" 如果我想像"Hello %s!" % name 一样打印而不是format,如何使用它? 我找到了我自己的问题here的答案;如果要右对齐,只需将&lt; 切换到&gt;,然后在&lt;&gt; 之前输入填充字符。例如,':0&gt;5'.format(167) 生成字符串 '00167'。如果有带符号的数字,可以将&gt;替换为=,即':0=5'.format(-167),得到符号和数字之间的填充字符,即@987654338 @【参考方案7】:

您可以使用ljust method on strings。

>>> name = 'John'
>>> name.ljust(15)
'John           '

请注意,如果名称超过 15 个字符,ljust 不会截断它。如果你想得到正好 15 个字符,你可以对结果字符串进行切片:

>>> name.ljust(15)[:15]

【讨论】:

我不知道这个,但是,嘿,那也很酷。对于所有字符串操作,我个人更喜欢format:P +1 这个答案也很有帮助,非常感谢,谢谢。我相信它在未来会有用。 更容易理解,因此这似乎更可取 @GamesBrainiac “我个人更喜欢所有字符串操作的格式” 各位大神,为什么要这样打自己? a, b = "Hello ", "world!"; %timeit "".format(a, b) → 1.17 µs。 %timeit a+b → 413 纳秒。 2.833× 更慢,正如之前的评论所提到的,readability! @amcgregor 速度不是一切。有时,您需要.format() 提供的更灵活的东西。【参考方案8】:

首先检查字符串的长度是否需要缩短,然后添加空格,直到它与字段长度一样长。

fieldLength = 15
string1 = string1[0:15] # If it needs to be shortened, shorten it
while len(string1) < fieldLength:
    rand += " "

【讨论】:

【参考方案9】:
string = ""
name = raw_input() #The value at the field
length = input() #the length of the field
string += name
string += " "*(length-len(name)) # Add extra spaces

这将添加所需的空格数,前提是该字段的长度 >= 提供的名称的长度

【讨论】:

与我在这里添加的其他几个建议类似的性能评论:您正在构建所涉及字符串的多个副本。输入字符串,一个计算的(不可实习的)可变长度字符串,然后是最终生成的填充字符串。而不是使用 O(1) tool provided for the job.

以上是关于如何在 Python 中用空格将字符串填充到固定长度?的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中用数字、字母和空格分割字符串?

SQL Server中易混淆的数据类型

在Python中用单个空格替换多个空格[重复]

如何在python pandas中用0填充空单元格[重复]

Python:匹配带有特殊字符和空格的长字符串,然后在开头添加两个字符

如何在java中的字符串中填充空格? [复制]