如何在Python中格式化具有固定宽度的文本块?

时间:2018-03-21 18:47:45

标签: python string-formatting

我正在尝试生成一个如下所示的字符串:

echo json_encode(array(
    'error' => array(
        'text' => $e->getMessage()
    )
));

其中姓名和电话号码不同,需要插入,电话号码应对齐。在本例中,我使用了以下模板:

Nadya's Cell:  (415) 123-4567
Jim's Cell:    (617) 123-4567

我不想手动添加空格,而是希望字符串的总宽度适应name1 = "Nadya" name2 = "Jim" phone_number1 = "(415) 123-4567" phone_number2 = "(617) 123-4567" string = "{name1}'s Cell: {phone_number1}\n{name2}'s Cell: {phone_number2}".format(**locals()) name1中最长的。

到目前为止,我已经能够提出以下https://docs.python.org/3.6/library/string.html以下内容:

name2

产生

max_length = max(len(name1), len(name2))

# This should use max_length and contain "'s Cell:"
string = "{name1:<7}{phone_number1}\n{name2:<7}{phone_number2}".format(**locals())
print(string)

问题是总宽度Nadya (415) 123-4567 Jim (617) 123-4567 仍然硬编码到模板中,我看不到如何在名称后添加7,因为这会在名字和撇号。任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

您可以使用嵌套格式说明符,这是一个经常被忽视的功能:

max_length = max(len(name1), len(name2)) + 2

string = """{name1:<{max_length}}{phone_number1}
{name2:<{max_length}}{phone_number2}""".format(**locals())

print(string)
# output:
# Nadya  (415) 123-4567
# Jim    (617) 123-4567

documentation只提到他们,这可能解释了为什么他们相对不为人知:

  

format_spec字段还可以包含嵌套的替换字段   它。这些嵌套的替换字段可能包含字段名称,   转换标志和格式规范,但更深的嵌套不是   允许。 format_spec中的替换字段被替换   在解释format_spec字符串之前。这允许   格式化要动态指定的值。

答案 1 :(得分:0)

以下是https://www.python.org/dev/peps/pep-0498/#format-specifiers之后使用f-strings的另一种解决方案:

name1 += "'s Cell:"
name2 += "'s Cell:"
max_length = max(len(name1), len(name2))

string = f"{name1:{max_length+2}}{phone_number1}\n{name2:{max_length+2}}{phone_number2}"
print(string)

产生

Nadya's Cell:  (415) 123-4567
Jim's Cell:    (617) 123-4567

根据需要。