Python - 缩进换行文本

Python - indenting wrapped text

我在Python-3

中有如下函数
def test_late_logs(tabs_data):

    current_date = datetime.now(timezone.utc).replace(minute=0, second=0, microsecond=0)

    text = "*** Manual logging ***\n"
    text += f"TAB LATE REPORT. Current date is {current_date}\n"
    text += "LATE BY".ljust(9) + "LAST SUCCESSFUL RUN".ljust(27) + "ACCEPTABLE LAG".ljust(16) + "TAB".ljust(50) + "IMPACT".ljust(20) + "DESCRIPTION" + "\n"

    for tab_name in tabs_data:
        tab_data = tabs_data[tab_name]
        text += f"{str(tab_data['is_late_by']):<9}{str(tab_data['last_successful_run']):<27}{str(dtab_data['acceptable_lag']):<16}{str(tab_name):<50}{str(tab_data['impact']):<20}{textwrap.TextWrapper(width=175,subsequent_indent=' '*123).fill(text=str(tab_data['description']))} \n"
        
    return text

当我从上面的代码打印 text 时,我得到以下内容

LATE BY  LAST SUCCESSFUL RUN        ACCEPTABLE LAG  TAB                                               IMPACT              DESCRIPTION
0:00:00  2022-03-07 10:00:00+00:00  5:00:00         xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx          impact_high                                                                                                                          xxxxxxxxxxxxxxxxxxxxxxx 
0:00:00  2022-03-07 10:00:00+00:00  5:00:00         xxxxxxxxxxxxxxxxxxxxxxxxxxxxx                     impact_high                                                                                                                          xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
0:00:00  2022-03-07 10:00:00+00:00  5:00:00         xxxxxxxxxxxxxxxxxxxxxxxxxxxxx                     impact_high                                                                                                                          xxxxxxxxxxxxxxxxxxxx 
0:00:00  2022-03-07 10:00:00+00:00  5:00:00         xxxxxxxxxxxxxxxxx                                 impact_medium                                                                                                                          xxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
2:00:00  2022-03-07 12:00:00+00:00  0:00:00         xxxxxxxxxxxxxxxxxxxxxxxxxxxxx                     impact_medium                                                                                                                          xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                                                                                                                           xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                                                                                                                           xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                                                                                                                           xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                                                                                                                           xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 

我还用不同的 initial_indent 值尝试了以下代码:

text += f"{str(tab_data['is_late_by']):<9}{str(tab_data['last_successful_run']):<27}{str(tab_data['acceptable_lag']):<16}{str(tab_name):<50}{str(tab_data['impact'])}{textwrap.TextWrapper(initial_indent=' '*1,width=175,subsequent_indent=' '*123).fill(text=str(tab_data['description']))} \n"

但是,我无法将 'description' 的换行文本格式化为放置在标题 'DESCRIPTION' 下方。 这是因为一些已经存在的固有缩进吗?或者我错过了什么?任何帮助将不胜感激。

tabs_data是一个字典如下:

tabs_data = {
        'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx': {
            'acceptable_lag' : timedelta(hours=5),
            'description' : 'xxxxxxxxxxxxxxxxxxxxxxx',
            'emails': ['xxxxxxxx@xxxxxxxxxxxx.com'],
            'slack_channels': ['#xxxxxxxxxxxxxxx']
        },
        'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx': {
            'acceptable_lag': timedelta(hours=5),
            'description': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
            'emails': ['xxxxxxxx@xxxxxxxxxxxx.com'],
            'slack_channels': ['#xxxxxxxxxxxxxxx']
        },
        'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx': {
            'acceptable_lag' : timedelta(hours=5),
            'description': 'xxxxxxxxxxxxxxxxxxxx',
            'emails': ['xxxxxxxx@xxxxxxxxxxxx.com'],
            'slack_channels': ['#xxxxxxxxxxxxxxx']
        },
        'xxxxxxxxxxxxxxxxx': {
            'acceptable_lag': timedelta(hours=5),
            'description': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
            'emails': ['xxxxxxxx@xxxxxxxxxxxx.com'],
            'slack_channels': ['#xxxxxxxxxxxxxxx']
        },
        'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx': {
            'acceptable_lag': timedelta(hours=0),
            'description': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
            'emails': ['xxxxxxxx@xxxxxxxxxxxx.com'],
            'slack_channels': ['#xxxxxxxxxxxxxxx']
        }
    }

您可以使用 textwrap.indent(string, ' '*154, predicate=should_indent) 指定一个函数来确定文本是否应该换行。 Docs

我不确定您是否能够在每个描述的开头添加一个字符,但如果可以,那么这应该可行。

在我的示例中,我在每个描述元素的开头添加了一个 1,然后在我的函数中我检查了该行是否以 1 开头,以确定它是否应该缩进该行.

def should_indent(line):
    if(line[0] != '1'):
        return True
    else:
        return False
def test_late_logs(tabs_data):

    current_date = datetime.now(timezone.utc).replace(
        minute=0, second=0, microsecond=0)

    text = "*** Manual logging ***\n"
    text += f"TAB LATE REPORT. Current date is {current_date}\n"
    text += "LATE BY".ljust(9) + "LAST SUCCESSFUL RUN".ljust(27) + "ACCEPTABLE LAG".ljust(
        16) + "TAB".ljust(50) + "IMPACT".ljust(20) + "DESCRIPTION" + "\n"

    for tab_name in tabs_data:
        tab_data = tabs_data[tab_name]
        text += f"{str(tab_data['is_late_by']):<9}\
            {str(tab_data['last_successful_run']):<27}\
                {str(tab_name):<50}{str(tab_data['impact']):<20}\
                    {textwrap.indent(textwrap.fill(str(tab_data['description']), width=24), ' '*154, predicate=should_indent)} \n"

    return text
tabs_data = {
    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx': {
        'is_late_by': "0:00:00",
        'last_successful_run': "2022-03-07 10:00:00+00:00",
        'impact': "impact_high",
        'acceptable_lag': timedelta(hours=5),
        'description': '1xxxxxxxxxxxxxxxxxxxxxxx',
        'emails': ['xxxxxxxx@xxxxxxxxxxxx.com'],
        'slack_channels': ['#xxxxxxxxxxxxxxx']
    },
    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx': {
        'is_late_by': "0:00:00",
        'impact': "impact_high",
        'last_successful_run': "2022-03-07 10:00:00+00:00",
        'acceptable_lag': timedelta(hours=5),
        'description': '1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
        'emails': ['xxxxxxxx@xxxxxxxxxxxx.com'],
        'slack_channels': ['#xxxxxxxxxxxxxxx']
    },
    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx': {
        'is_late_by': "0:00:00",
        'impact': "impact_high",
        'last_successful_run': "2022-03-07 10:00:00+00:00",
        'acceptable_lag': timedelta(hours=5),
        'description': '1xxxxxxxxxxxxxxxxxxxx',
        'emails': ['xxxxxxxx@xxxxxxxxxxxx.com'],
        'slack_channels': ['#xxxxxxxxxxxxxxx']
    },
    'xxxxxxxxxxxxxxxxx': {
        'is_late_by': "0:00:00",
        'impact': "impact_high",
        'last_successful_run': "2022-03-07 10:00:00+00:00",
        'acceptable_lag': timedelta(hours=5),
        'description': '1xxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
        'emails': ['xxxxxxxx@xxxxxxxxxxxx.com'],
        'slack_channels': ['#xxxxxxxxxxxxxxx']
    },
    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx': {
        'is_late_by': "0:00:00",
        'impact': "impact_high",
        'last_successful_run': "2022-03-07 10:00:00+00:00",
        'acceptable_lag': timedelta(hours=0),
        'description': '1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
        'emails': ['xxxxxxxx@xxxxxxxxxxxx.com'],
        'slack_channels': ['#xxxxxxxxxxxxxxx']
    }
}

这是我得到的输出:

*** Manual logging ***
TAB LATE REPORT. Current date is 2022-03-08 17:00:00+00:00
LATE BY  LAST SUCCESSFUL RUN        ACCEPTABLE LAG  TAB                                               IMPACT              DESCRIPTION
0:00:00              2022-03-07 10:00:00+00:00                  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx          impact_high                             1xxxxxxxxxxxxxxxxxxxxxxx 
0:00:00              2022-03-07 10:00:00+00:00                  xxxxxxxxxxxxxxxxxxxxxxxxxxxxx                     impact_high                             1xxxxxxxxxxxxxxxxxxxxxxx
                                                                                                                                                          xxxxxxxxxxxxxxxxxxxxxxxx
                                                                                                                                                          xxxxxxxxxxxxxxxxxxxxxxxx
                                                                                                                                                          xxxxxxxxxxxxxxxxxxxxxxxx
                                                                                                                                                          xxxxxxxxxxxxxxxxxxxxxxxx
                                                                                                                                                          xxxxxxxxxxxxxxxxxxxxxxxx
                                                                                                                                                          xxxxxxxxxxxxxxxxxxxxxxxx
                                                                                                                                                          xxxxxxxxxxxxxxxxxxxxxxxx
                                                                                                                                                          xxxxxxxxxxxxxxxxxxxxxxxx
                                                                                                                                                          xxxxxxxxxxxxxxxxxxx 
0:00:00              2022-03-07 10:00:00+00:00                  xxxxxxxxxxxxxxxxx                                 impact_high                             1xxxxxxxxxxxxxxxxxxxxxxx
                                                                                                                                                          xxxxxx