Python 格式化输出
在本章中,将讨论不同的输出格式化技术。
字符串格式化运算符
Python最酷的特性之一就是字符串格式化运算符%。这个运算符是字符串独有的,弥补了C语言中printf()系列函数的不足。在字符串中,使用了C语言中的格式规范符号(%d %c %f %s等)作为占位符。
以下是一个简单的例子 –
print ("My name is %s and weight is %d kg!" % ('Zara', 21))
它将产生以下的 输出 −
My name is Zara and weight is 21 kg!
format()方法
Python 3.0 引入了format()方法来更高效地处理复杂字符串格式化。此方法已被后移至Python 2.6和Python 2.7。
此内置字符串类方法提供了进行复杂变量替换和值格式化的能力。这种新的格式化技术被认为更加优雅。
语法
format()方法的一般语法如下所示 –
str.format(var1, var2,...)
返回值
该方法返回一个格式化的字符串。
字符串本身包含占位符{},其中变量的值会被依次插入。
示例
name="Rajesh"
age=23
print ("my name is {} and my age is {} years".format(name, age))
它会产生以下 输出 –
my name is Rajesh and my age is 23 years
您可以使用变量作为format()方法的关键字参数,并在字符串中使用变量名作为占位符。
print ("my name is {name} and my age is {age}
years".format(name="Rajesh", age=23))
你还可以指定C风格的格式符号。唯一的区别是使用冒号:代替百分号%。例如,使用{:s}代替%s,使用{:d}代替%d。
name="Rajesh"
age=23
print ("my name is {:s} and my age is {:d} years".format(name, age))
f-strings
在Python中,f-strings或Literal String Interpolation是另一种格式化方法。使用这种格式化方法,您可以在字符串常量中嵌入Python表达式。Python的f-strings更快、更易读、更简洁且更少出错。
字符串以’f’前缀开始,并在其中插入一个或多个占位符,其值动态填充。
name = 'Rajesh'
age = 23
fstring = f'My name is {name} and I am {age} years old'
print (fstring)
它将产生以下 输出 −
My name is Rajesh and I am 23 years old
模板字符串
string模块中的Template类提供了一种动态格式化字符串的替代方法。Template类的一个好处是能够自定义格式化规则。
一个有效的模板字符串,或占位符,由两部分组成:”$”符号后面跟着一个有效的Python标识符。
你需要创建一个Template类的对象,并将模板字符串作为构造函数的参数。
接下来,调用Template类的substitute()方法。它将提供的值作为参数放置在模板字符串的位置。
示例
from string import Template
temp_str = "My name is name and I amage years old"
tempobj = Template(temp_str)
ret = tempobj.substitute(name='Rajesh', age=23)
print (ret)
它将产生如下 输出 −
My name is Rajesh and I am 23 years old
文本包装模块
Python的textwrap模块中的wrap类包含了通过调整输入段落中的换行符来格式化和包装纯文本的功能。它有助于使文本格式良好、美观。
textwrap模块有以下便利函数:
textwrap.wrap(text, width=70)
将文本(一个字符串)中的单个段落包装,使每行最多有width个字符。返回一个没有最后换行符的输出行列表。可选的关键字参数对应TextWrapper的实例属性。默认宽度为70。
textwrap.fill(text, width=70)
将文本中的单个段落包装,并返回一个包含包装段落的单个字符串。
这两种方法内部都创建了TextWrapper类的一个对象,并在其上调用一个单一的方法。由于实例不可重用,更有效的方法是自己创建TextWrapper对象。
示例
import textwrap
text = '''
Python is a high-level, general-purpose programming language. Its design philosophy emphasizes code readability with the use of significant indentation via the off-side rule.
Python is dynamically typed and garbage-collected. It supports multiple programming paradigms, including structured (particularly procedural), object-oriented and functional programming. It is often described as a "batteries included" language due to its comprehensive standard library.
'''
wrapper = textwrap.TextWrapper(width=40)
wrapped = wrapper.wrap(text = text)
# Print output
for element in wrapped:
print(element)
它将产生以下 输出 −
Python is a high-level, general-purpose
programming language. Its design
philosophy emphasizes code readability
with the use of significant indentation
via the off-side rule. Python is
dynamically typed and garbage-collected.
It supports multiple programming
paradigms, including structured
(particularly procedural), objectoriented and functional programming. It
is often described as a "batteries
included" language due to its
comprehensive standard library.
下面是TextWrapper对象的定义属性:
- width -(默认值:70)包装行的最大长度。
-
expand_tabs -(默认值:True)如果为True,则使用文本的expandtabs()方法将文本中的所有制表符字符扩展为空格。
-
tabsize -(默认值:8)如果expand_tabs为True,则根据当前列和给定的制表符大小将文本中的所有制表符字符扩展为零个或多个空格。
-
replace_whitespace -(默认值:True)如果为True,在制表符展开之后但包装之前,wrap()方法会将每个空白字符替换为一个空格。
-
drop_whitespace -(默认值:True)如果为True,在换行但缩进之前,删除每行开头和结尾的空白字符。然而,如果其后跟着非空白字符,则段落开头的空白字符不会被删除。如果删除的空白字符占据了一整行,则整行将被删除。
-
initial_indent -(默认值:”)将添加到包装输出的第一行的字符串。
-
subsequent_indent -(默认值:”)将添加到除第一行外的所有包装输出行的字符串。
-
fix_sentence_endings -(默认值:False)如果为True,则TextWrapper尝试检测句子结束并确保句子之间始终以正好两个空格分隔。这通常适用于等宽字体的文本。
-
break_long_words -(默认值:True)如果为True,则为了确保没有行超过width,将分割长度大于width的单词。如果为False,长单词将不会被分割,有些行可能会超过width。
-
break_on_hyphens -(默认值:True)如果为True,则包装将优先发生在英语中通常的空白和连字符之后的复合词中。如果为False,则只有空白字符会被视为可能的换行位置。
shorten()函数
折叠并截断给定的文本以适应给定的宽度。首先将文本的空白字符折叠。如果它适合width,则返回原样。否则,尽可能多地连接字词,然后附加占位符-
示例
import textwrap
python_desc = """Python is a general-purpose interpreted, interactive, object-oriented, and high-level programming language. It was created by Guido van Rossum during 1985- 1990. Like Perl, Python source code is also available under the GNU General Public License (GPL). This tutorial gives enough understanding on Python programming language."""
my_wrap = textwrap.TextWrapper(width = 40)
short_text = textwrap.shorten(text = python_desc, width=150)
print('\n\n' + my_wrap.fill(text = short_text))
它将产生以下 输出 –
Python is a general-purpose interpreted,
interactive, object-oriented,and high
level programming language. It was
created by Guido van Rossum [...]
pprint模块
Python标准库中的pprint模块可以使Python数据结构以美观的方式显示出来。pprint的名称代表着漂亮的打印器。任何Python解释器能正确解析的数据结构都会被优雅地格式化。
格式化的表达式尽量保持在一行上,但如果长度超过格式化的宽度参数,就会换行成多行。pprint输出的一个独特特点是,在显示前,字典会自动排序。
PrettyPrinter类
pprint模块包含了PrettyPrinter类的定义。它的构造函数的格式如下:
语法
pprint.PrettyPrinter(indent, width, depth, stream, compact)
参数
- indent - 定义每个递归级别上添加的缩进。默认值为1。
-
width - 默认为80。所需的输出受该值限制。如果长度大于宽度,则会被分为多行。
-
depth - 控制要打印的级别数。
-
stream - 默认为std.out – 默认输出设备。它可以接受任何流对象,如文件。
-
compact - 默认情况下设置为False。如果为True,则只显示在宽度范围内可调整的数据。
PrettyPrinter类定义了以下方法:
pprint()方法
打印PrettyPrinter对象的格式化表示。
pformat()方法
根据构造函数的参数返回对象的格式化表示。
示例
以下示例演示了PrettyPrinter类的简单用法。
import pprint
students={"Dilip":["English", "Maths", "Science"],"Raju":{"English":50,"Maths":60, "Science":70},"Kalpana":(50,60,70)}
pp=pprint.PrettyPrinter()
print ("normal print output")
print (students)
print ("----")
print ("pprint output")
pp.pprint(students)
输出显示正常和漂亮的打印显示−
normal print output
{'Dilip': ['English', 'Maths', 'Science'], 'Raju': {'English': 50, 'Maths': 60, 'Science': 70}, 'Kalpana': (50, 60, 70)}
----
pprint output
{'Dilip': ['English', 'Maths', 'Science'],
'Kalpana': (50, 60, 70),
'Raju': {'English': 50, 'Maths': 60, 'Science': 70}}
该 pprint 模块还定义了方便的函数pprint()和pformat(),对应于PrettyPrinter的方法。下面的示例使用pprint()函数。
from pprint import pprint
students={"Dilip":["English", "Maths", "Science"],
"Raju":{"English":50,"Maths":60, "Science":70},
"Kalpana":(50,60,70)}
print ("normal print output")
print (students)
print ("----")
print ("pprint output")
pprint (students)
示例
下一个示例中使用了pformat()方法和pformat()函数。要使用pformat()方法,首先需要设置PrettyPrinter对象。在这两种情况下,使用普通的print()函数显示格式化的表示。
import pprint
students={"Dilip":["English", "Maths", "Science"],
"Raju":{"English":50,"Maths":60, "Science":70},
"Kalpana":(50,60,70)}
print ("using pformat method")
pp=pprint.PrettyPrinter()
string=pp.pformat(students)
print (string)
print ('------')
print ("using pformat function")
string=pprint.pformat(students)
print (string)
这是以上代码的输出结果:
using pformat method
{'Dilip': ['English', 'Maths', 'Science'],
'Kalpana': (50, 60, 70),
'Raju': {'English': 50, 'Maths': 60, 'Science': 70}}
------
using pformat function
{'Dilip': ['English', 'Maths', 'Science'],
'Kalpana': (50, 60, 70),
'Raju': {'English': 50, 'Maths': 60, 'Science': 70}}
Pretty printer可以与自定义类一起使用。在类内部,repr()方法被重写。当使用repr()函数时,将调用repr()方法,它是Python对象的官方字符串表示。当我们将对象作为参数传递给print()函数时,它打印出repr()函数的返回值。
示例
在这个示例中,repr()方法返回了player对象的字符串表示 –
import pprint
class player:
def __init__(self, name, formats=[], runs=[]):
self.name=name
self.formats=formats
self.runs=runs
def __repr__(self):
dct={}
dct[self.name]=dict(zip(self.formats,self.runs))
return (repr(dct))
l1=['Tests','ODI','T20']
l2=[[140, 45, 39],[15,122,36,67, 100, 49],[78,44, 12, 0, 23, 75]]
p1=player("virat",l1,l2)
pp=pprint.PrettyPrinter()
pp.pprint(p1)
上面代码的 输出 是 –
{'virat': {'Tests': [140, 45, 39], 'ODI': [15, 122, 36, 67, 100, 49],
'T20': [78, 44, 12, 0, 23, 75]}}