输出格式化
reprlib 模块提供了 repr() 的一个定制版本,用于大型或深嵌套容器的缩略显示:
import reprlibprint(reprlib.repr(set('wherethereisawill,thereisaway!')))print(reprlib.repr(set('sup')))
运行结果:
{'!', ',', 'a', 'e', 'h', 'i', ...}{'p', 's', 'u'}
pprint 模块以解释器可读的方式,为打印内置的和用户定义的对象提供了更复杂的控制。当结果超过一行时,“Pretty Printer” 会添加换行符和缩进,以更清楚地显示数据结构:
import pprintt = [[[['black', 'cyan'], 'white', ['green', 'red']], [['magenta','yellow'], 'blue']]]pprint.pprint(t, width=30)pprint.pprint(t, width=100)
运行结果:
[[[['black', 'cyan'],'white',['green', 'red']],[['magenta', 'yellow'],'blue']]][[[['black', 'cyan'], 'white', ['green', 'red']], [['magenta', 'yellow'], 'blue']]]
textwrap 模块格式化文本段落以适应给定的屏幕宽度:
import textwrapdoc = """The wrap() method is just like fill() except that it returnsa list of strings instead of one big string with newlines to separatethe wrapped lines."""print(textwrap.fill(doc, width=40))
运行结果:
The wrap() method is just like fill()except that it returns a list of stringsinstead of one big string with newlinesto separate the wrapped lines.
locale 模块访问特定于某种文化的数据格式的数据库。locale 模块 format 函数的 grouping 属性提供了一种使用组分隔符格式化数字的直接方式:
import localer1 = locale.setlocale(locale.LC_ALL, 'zh_CN.UTF-8')print(r1)x = 1234567.8r2 = locale.format_string("%d", x, grouping=True)print(r2)conv = locale.localeconv()r3 = locale.format_string("%s%.*f", (conv['currency_symbol'], conv['frac_digits'], x), grouping=True)print(r3)
运行结果:
zh_CN.UTF-81,234,567¥1,234,567.80
模板
string 模块包括一个功能强大的 Template 类,它具有适合最终用户编辑的简化语法。这允许用户在不修改应用程序的情况下定制他们的应用程序。
该格式使用的占位符名称由 $ 和有效的 Python 标识符组成(字母数字字符和下划线)。用大括号包围占位符可以让它后面跟着更多的字母数字,中间没有空格。写入 $$ 将创建一个转义的 $:
from string import Templatet = Template('${fairy} learned $howmany metamorphoses from $cause and brought it into use freely.')r = t.substitute(fairy='Sun wukong', howmany='72' , cause='Puti')print(r)
运行结果:
Sun wukong learned 72 metamorphoses from Puti and brought it into use freely.
当字典或关键字参数中没有提供占位符时,substitute() 方法将引发 KeyError。对于 mail-merge 风格的应用程序,用户提供的数据可能是不完整的,而 safe_substitute() 方法可能更合适 —— 如果数据缺失,它将保留占位符不变:
from string import Templatet = Template('给 $fairy 1 个 $fruit。')d = dict(fairy='孙悟空')r2 = t.safe_substitute(d)print(r2)r1 = t.substitute(d)print(r1)
模板子类可以指定自定义分隔符。例如,照片浏览的批量重命名实用程序可以选择使用百分号作为当前日期、图像序列号或文件格式的占位符:
import time, os.pathfrom string import Templatephotofiles = ['img_1074.jpg', 'img_1076.jpg', 'img_1077.jpg']class BatchRename(Template):delimiter = '%'fmt = input('输入重命名风格 (%d-date %n-seqnum %f-format): ')t = BatchRename(fmt)date = time.strftime('%y%m%d')for i, filename in enumerate(photofiles):base, ext = os.path.splitext(filename)newname = t.substitute(d=date, n=i, f=ext)print('{0} --> {1}'.format(filename, newname))
运行结果:
输入重命名风格 (%d-date %n-seqnum %f-format): %d%n%fimg_1074.jpg --> 2201020.jpgimg_1076.jpg --> 2201021.jpgimg_1077.jpg --> 2201022.jpg
模板的另一个应用是将程序逻辑从多种输出格式的细节中分离出来。这使得用定制模板替代 XML 文件、纯文本报告和 HTML 网页报告成为可能。
官方文档:
https://docs.python.org/3.9/tutorial/stdlib2.html




