您的位置:

Python pprint模块

在打印程序中的数据时,我们遇到了以标准格式打印数据集的问题。输出中打印的数据打印时没有定义格式,这使得数据看起来没有组织。此外,我们很难从打印的数据集中寻找特定的信息。如果我们必须以某种设定的格式打印这些数据,我们必须对数据集的每一行和每一列使用多个格式函数。当给定的数据集有多个不同大小的行和列条目时,这将变得耗时且繁忙。因此,如果我们必须在程序的输出中以某种排序的方式打印数据集,我们必须寻找一些以集合格式打印数据集的替代选择。当我们从数据集中寻找某些特定信息时,这种设置格式的打印数据集也会有所帮助。这就是为什么在开发和编程任务中,如此漂亮的打印机软件包的重要性会增加。许多编程语言为我们提供了包,我们可以使用这些包在输出中以设定的格式打印数据集。具体来说 Python,它有一个 pprint模块,该模块带有多种功能,用于以某种集合或定义的格式打印数据集。因此,我们将在本教程中研究 Python 的 pprint模块,并学习如何使用该模块的功能在输出中以某种特定格式打印数据集。

Python pexpect模块介绍

pprint模块是 Python 标准库的一部分,它附带了多个函数,用于在输出中以特定格式打印给定数据集。pprint模块本身的名称代表漂亮的打印机模块,它也被称为数据漂亮的打印机模块。由于 pprint模块的功能,数据结构和数据集的美观外观也是可能的。pprint模块使我们能够以定义的格式打印任何给定的数据结构,从而在输出中给它一个美观的外观。在 Python 程序中被正确解析和执行的任何数据结构或数据集,在输出中都被 pprint模块的功能优雅地格式化。

输出中数据结构的格式化表达式尽可能由 pprint模块保持在一行中,但有时当格式化表达式的长度超过定义的长度时,它会被分成多行。有时,当格式化表达式的大小超过 pprint模块格式化函数的默认宽度参数时,它会分成多行。程序 pprint 输出中的字典数据在输出中表示或显示结果之前会自动格式化,这是 pprint模块的一个独特功能。因此,我们可以说使用 pprint模块打印的数据结构良好,可读性更强。

Python 中的 pprint模块:安装

pprint模块自带 Python 的标准库,即 pprint 是随标准 Python 发行版的安装一起安装的 Python 预装模块。因此,在 Python 程序中使用 pprint模块之前,我们不必执行任何安装过程。我们可以直接开始将这个模块导入 Python 程序来使用它,并了解它的实现和功能。我们可以用下面一行代码在程序中导入 Python 的 pprint模块:


# Importing the pprint module
import pprint

因此,我们可以在本教程的示例程序中使用这个模块来使用它并理解它的实现。

pprint模块中的类

Python 的 pprint模块在其标准库中包含了 PrettyPrinter 类的定义,用于以排序格式设置给定的数据结构。要使用这个模块的 PrettyPrinter 类,我们必须在程序中为这个类定义一个构造器,只有在这之后,我们才能使用这个 PrettyPrinter 类的 pprint模块的函数。

定义打印机类构造器的语法:

如果我们必须在程序中使用 pprint 类,我们可以通过在程序中定义该类的构造器来使用它,然后在以某种特定格式打印数据结构或数据集时,将该构造器与 pprint模块的函数一起使用。

我们必须使用以下语法或代码行来定义 pprint 类的构造器:


# Constructor for pprint class
pcr = ppr.PrettyPrinter(indentGiven, widthOfLine, depthInData, stream, compact)

参数:从上面写的语法中我们可以看到,可以使用 pprint模块的 PrettyPrinter()函数定义 pprint 类的构造器。函数的作用是:当我们使用它来定义 printyprinter 类的构造器时,它接受以下五个参数:

(i)缩进给定:函数的缩进参数用于定义在每个递归级别(每行和每列中的数据值)之后应该添加的缩进。如果我们不通过在函数中传递一个参数来定义这个参数,函数将采用默认参数,缩进参数为 1。

(ii)行宽:函数的这个参数定义了数据结构中每一行的宽度,数据结构的期望输出格式被限制在这个格式。width 参数的默认值是 80,当我们没有在函数中提供任何 width 参数时,就会用到它。如果数据结构行的长度大于函数中定义的宽度参数,它将在输出中分解成多个行结构。

(iii)深度数据:函数的深度参数用于控制输出中打印的级别数。它是函数的可选参数,此参数没有默认值。

(iv)流:流参数的默认值为 std.out-默认输出机器。此参数在函数中用于在输出中打印数据结构时获取任何流对象,如文件。

(v) compact :是 PrettyPrinter()函数中使用的最后一个参数,默认情况下 compact 参数 id 设置为 False。只有当我们显示的数据在宽度范围内可调时,我们才需要将该参数设置为 True。

这是在定义 pretyprinter 类的构造器时,在 pretyprinter()函数中应该给出的五个参数。我们可以使用这些参数来指定我们想要在输出中打印给定数据结构的格式。

PrettyPrinter 类中的方法:

pprint模块有多个方法,其中一些方法是使用 PrettyPrinter 类的构造器定义的。这些由 PrettyPrinter 类的构造器定义的方法或函数在程序中用来以指定的格式打印数据结构。下面是在 PrettyPrinter 类的构造器下定义的两个方法:

a) pprint()函数:PrettyPrinter 类中的第一个方法是 pprint()函数,它在输出中打印 PrettyPrinter 对象的格式化表示(其中来自数据结构的数据以特定格式存储)。我们可以使用这个函数作为 print 语句来打印程序中的任何数据。

b) pformat()函数:基于我们在 pretyprinter 类的构造器中提供的参数,这个函数返回 pretyprinter 对象的格式化表示。

这两个函数是在 PrettyPrinter 类的构造器下定义的,我们可以将这些方法与构造器一起使用,并在输出中打印数据结构。

Python 中的 pprint模块:实现

在本教程中,我们已经学习了 pprint模块的函数、类和方法。现在,我们将在教程的这一部分了解 pprint模块及其类和函数的工作。我们将在示例程序中使用 pprint模块的函数和类构造器来理解它们在程序中的功能和工作。我们将使用示例程序中的 pprint()和 pformat()函数来理解它们的实现,以及我们如何使用 pformat()函数根据输出中指定的格式打印数据结构。

看下面的示例程序,了解打印数据结构的 pprint模块的功能实现:

实现 1:使用 pprint()函数进行格式化输出:

在这个实现部分,我们将使用 pprint模块的 pprint()函数以指定的格式打印程序中给定的数据结构,这样它看起来会更吸引人和格式化。我们将使用一些示例程序来理解这个 pprint()函数的工作原理,函数中给出了不同的参数。首先,查看下面的示例程序,了解使用 pprint()函数打印的输出:

示例 1: 看看下面的 Python 程序,我们在其中比较了简单的 print 语句输出和 pprint()函数输出:


# Importing the pprint module as ppr
import pprint as ppr
# Defining a data structure that has students data
studentDS = {"Dwayne Johnson": ["English", "Chemistry", "Physics", "Mathematics", "Biology"],
     "Randy Orton" :{"English": 50,"Physics": 60,
     "Chemistry": 70, "Mathematics": 80, "Biology": 90},
     "Karl Marx" :(50, 60, 70, 80, 90)}
# Defining Constructor for the PrettyPrinter class
ppConst = ppr.PrettyPrinter()
# Printing normal output of the student data structure
print ("Normal output of student data structure with print statement:")
print (studentDS)
print ("----")
# Printing formatted output of the pprint() function
print ("The pprint function's formatted output of the student data structure:")
# Using pprint() function
ppConst.pprint(studentDS)

输出:

Normal output of student data structure with print statement:
{'Dwayne Johnson': ['English', 'Chemistry', 'Physics', 'Mathematics', 'Biology'], 'Randy Orton': {'English': 50, 'Physics': 60, 'Chemistry': 70, 'Mathematics': 80, 'Biology': 90}, 'Karl Marx': (50, 60, 70, 80, 90)}
----
The pprint function's formatted output of the student data structure:
{'Dwayne Johnson': ['English',
                    'Chemistry',
                    'Physics',
                    'Mathematics',
                    'Biology'],
 'Karl Marx': (50, 60, 70, 80, 90),
 'Randy Orton': {'Biology': 90,
                 'Chemistry': 70,
                 'English': 50,
                 'Mathematics': 80,
                 'Physics': 60}}

正如我们所看到的,学生数据结构的正常打印输出和 pprint 函数的格式化输出都打印在输出中。我们可以观察到正常输出和 pprint()函数的格式化输出之间的差异,并得出结论,pprint()函数的格式化输出非常简单且易于观察。这就是我们如何在没有任何参数的情况下使用 pprint()函数来打印给定数据结构的格式化输出。

说明:我们首先将程序中的 pprint模块导入为 ppr,之后定义了 PrettyPrinter 类的构造器。我们还定义了一些学生数据的示例数据结构,并将该数据结构命名为 students。我们将 PrettyPrinter 类的构造器变量命名为 ppConst,并在稍后与 pprint()函数一起使用。然后,我们将 pprint()函数与 ppConst 构造器变量一起使用。在使用 pprint()函数时,我们将学生的数据结构变量作为参数传递,以格式化学生数据结构的输出。之后,首先,我们使用 studentDS 变量打印了数据结构的正常输出。最后,我们使用 pprint()函数打印了 pprint()函数的格式化输出,以便与正常输出进行比较。

函数的递归数据结构打印:

我们也可以使用 pprint()函数递归打印数据结构。在这里,我们还将尝试从给定的数据结构中打印一个递归对象,对于进一步的递归过程,在输出中将只打印引用。查看下面的示例程序,了解 pprint()函数的递归对象打印实现:

示例 2: 看看下面的程序,我们已经在输出中打印了一个递归对象:


# Importing the pprint module as ppr
import pprint as ppr
# Define a list of numbers
numList = list(range(24, 31))
# Appending the list
numList.append(numList)
# Printing appended number list
print("Appended list of numbers: ")
print(numList)
print("----------------")
#Printing recursive object with pprint() function
print("Appended list with recursive object from pprint function: ")
ppr.pprint(numList)

输出:

Appended list of numbers: 
[24, 25, 26, 27, 28, 29, 30, [...]]
----------------
Appended list with recursive object from pprint function: 
[24, 25, 26, 27, 28, 29, 30, ] 

如我们所见,当我们使用 pprint()函数打印输出中的附加列表时,列表中的最后一项被打印为递归对象。输出显示递归是从列表中最后一项的对象引用 id 开始的。

提供宽度参数:

现在,我们将提供 PrettyPrinter 类的宽度参数(我们在上一节中讨论过),同时为其定义构造器。我们在 PrettyPrinter()函数中提供的宽度根据给定的宽度格式化输出,并以相同的格式呈现。查看下面的示例程序,以了解 PrettyPrinter 类的宽度参数实现:

示例 3: 看看下面的程序,我们在其中为 PrettyPrinter 类的构造器使用了宽度参数:


# Importing the pprint module as ppr
import pprint as ppr
# Defining a data structure which having student's data
studentDS = {"Dwayne Johnson": ["English", "Chemistry", "Physics", "Mathematics", "Biology"],
     "Randy Orton" :{"English": 50,"Physics": 60,
     "Chemistry": 70, "Mathematics": 80, "Biology": 90},
     "Karl Marx" :(50, 60, 70, 80, 90)}
# Defining Constructor for the PrettyPrinter class with width argument
ppConst = ppr.PrettyPrinter(width = 24)
# Printing formatted output of the pprint() function
print ("The pprint function's formatted output of the student data structure with defined width:")
ppConst.pprint(studentDS)

输出:

The pprint function's formatted output of the student data structure with defined width:
{'Dwayne Johnson': ['English',
                    'Chemistry',
                    'Physics',
                    'Mathematics',
                    'Biology'],
 'Karl Marx': (50,
               60,
               70,
               80,
               90),
 'Randy Orton': {'Biology': 90,
                 'Chemistry': 70,
                 'English': 50,
                 'Mathematics': 80,
                 'Physics': 60}}

我们可以看到,学生数据结构的格式化输出是根据我们在 PrettyPrinter 类中使用 width 参数提供的宽度打印的,即 width = 24。

实现 2:对格式化输出使用 pformat()函数:

在这个实现部分,我们将学习如何实现 pformat()函数来打印给定数据结构的格式化输出。我们可以通过以下两种方式从 PrettyPrinter 构造器中实现 pformat 函数:

(i) 作为方法的 pformat

(ii) 作为函数的 pformat

我们将在每种情况下使用一个示例程序来理解 pformat 的实现。

(i)使用 pformat 作为方法:

在这里,我们将使用像 pformat 这样的方法来打印带有该功能的格式化输出。我们可以看下面的示例程序来理解 pformat 的方法实现:


# Importing the pprint module as ppr
import pprint as ppr
# Defining a data structure which having student's data
studentDS = {"Dwayne Johnson": ["English", "Chemistry", "Physics", "Mathematics", "Biology"],
     "Randy Orton" :{"English": 50,"Physics": 60,
     "Chemistry": 70, "Mathematics": 80, "Biology": 90},
     "Karl Marx" :(50, 60, 70, 80, 90)}
# Defining Constructor for the PrettyPrinter class
ppConst = ppr.PrettyPrinter()
# Using pformat() function
pfOutput = ppConst.pformat(studentDS)
# Printing formatted output of the pprint() function
print ("The pformat method's formatted output of the student data structure:")
print(pfOutput)

输出:

The pformat method's formatted output of the student data structure:
{'Dwayne Johnson': ['English',
                    'Chemistry',
                    'Physics',
                    'Mathematics',
                    'Biology'],
 'Karl Marx': (50, 60, 70, 80, 90),
 'Randy Orton': {'Biology': 90,
                 'Chemistry': 70,
                 'English': 50,
                 'Mathematics': 80,
                 'Physics': 60}}

(ii)使用 pformat 作为函数:

我们可以看下面的示例程序来理解 pformat 的函数实现:


# Importing the pprint module as ppr
import pprint as ppr
# Defining a data structure which having student's data
studentDS = {"Dwayne Johnson": ["English", "Chemistry", "Physics", "Mathematics", "Biology"],
     "Randy Orton" :{"English": 50,"Physics": 60,
     "Chemistry": 70, "Mathematics": 80, "Biology": 90},
     "Karl Marx" :(50, 60, 70, 80, 90)}
# Using pformat() function
pfOutput = ppr.pformat(studentDS)
# Printing formatted output of the pprint() function
print ("The pformat function's formatted output of the student data structure:")
print(pfOutput)

输出:

The pformat function's formatted output of the student data structure:
{'Dwayne Johnson': ['English',
                    'Chemistry',
                    'Physics',
                    'Mathematics',
                    'Biology'],
 'Karl Marx': (50, 60, 70, 80, 90),
 'Randy Orton': {'Biology': 90,
                 'Chemistry': 70,
                 'English': 50,
                 'Mathematics': 80,
                 'Physics': 60}}