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
我在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