原文: http://zetcode.com/python/prettytable/

PrettyTable 教程展示了如何使用 Python PrettyTable 模块在 Python 中生成 ASCII 表。 在本教程中,我们使用PTable模块,该模块是原始 PrettyTable 库的分支。

PrettyTable

PrettyTable 是用于生成简单 ASCII 表的 Python 库。 它的灵感来自 PostgreSQL shell psql中使用的 ASCII 表。 我们可以控制表格的许多方面,例如列填充的宽度,文本的对齐方式或表格边框。 我们可以对数据进行排序。

我们还可以选择在最终输出中将显示哪些列和行。 PrettyTable 可以从 CSV,HTML 或数据库游标读取数据,并以 ASCII 或 HTML 输出数据。

PrettyTable 安装

  1. $ sudo pip3 install PTable

我们使用pip3工具安装 PrettyTable。

生成 PrettyTable

可以使用add_row()add_column()方法创建表。

create_by_row.py

  1. #!/usr/bin/python3
  2. from prettytable import PrettyTable
  3. x = PrettyTable()
  4. x.field_names = ["City name", "Area", "Population", "Annual Rainfall"]
  5. x.add_row(["Adelaide", 1295, 1158259, 600.5])
  6. x.add_row(["Brisbane", 5905, 1857594, 1146.4])
  7. x.add_row(["Darwin", 112, 120900, 1714.7])
  8. x.add_row(["Hobart", 1357, 205556, 619.5])
  9. x.add_row(["Sydney", 2058, 4336374, 1214.8])
  10. x.add_row(["Melbourne", 1566, 3806092, 646.9])
  11. x.add_row(["Perth", 5386, 1554769, 869.4])
  12. print(x)

该示例使用add_row()方法创建一个 PrettyTable。

  1. from prettytable import PrettyTable

从模块中,我们导入PrettyTable

  1. x.field_names = ["City name", "Area", "Population", "Annual Rainfall"]

我们设置标题名称。

  1. x.add_row(["Adelaide", 1295, 1158259, 600.5])
  2. x.add_row(["Brisbane", 5905, 1857594, 1146.4])

这些行通过add_row()添加到表中。

  1. print(x)

最后,我们将表格打印到控制台。

  1. $ ./create_by_row.py
  2. +-----------+------+------------+-----------------+
  3. | City name | Area | Population | Annual Rainfall |
  4. +-----------+------+------------+-----------------+
  5. | Adelaide | 1295 | 1158259 | 600.5 |
  6. | Brisbane | 5905 | 1857594 | 1146.4 |
  7. | Darwin | 112 | 120900 | 1714.7 |
  8. | Hobart | 1357 | 205556 | 619.5 |
  9. | Sydney | 2058 | 4336374 | 1214.8 |
  10. | Melbourne | 1566 | 3806092 | 646.9 |
  11. | Perth | 5386 | 1554769 | 869.4 |
  12. +-----------+------+------------+-----------------+

这是输出。

在下一个示例中,我们使用add_column()方法创建相同的表。

create_by_column.py

  1. #!/usr/bin/python3
  2. from prettytable import PrettyTable
  3. x = PrettyTable()
  4. column_names = ["City name", "Area", "Population", "Annual Rainfall"]
  5. x.add_column(column_names[0], ["Adelaide", "Brisbane", "Darwin",
  6. "Hobart", "Sydney", "Melbourne", "Perth"])
  7. x.add_column(column_names[1], [1295, 5905, 112, 1357, 2058, 1566, 5386 ])
  8. x.add_column(column_names[2], [1158259, 1857594, 120900, 205556, 4336374,
  9. 3806092, 1554769])
  10. x.add_column(column_names[3], [600.5, 1146.4, 1714.7, 619.5, 1214.8,
  11. 646.9, 869.4])
  12. print(x)

列名是add_column()方法的第一个参数。

PrettyTable 删除行

使用del_row()可以删除特定的行。 该方法获取要删除的行的索引。 请注意,索引从零开始。

delete_rows.py

  1. #!/usr/bin/python3
  2. from prettytable import PrettyTable
  3. x = PrettyTable()
  4. x.field_names = ["City name", "Area", "Population", "Annual Rainfall"]
  5. x.add_row(["Adelaide", 1295, 1158259, 600.5])
  6. x.add_row(["Brisbane", 5905, 1857594, 1146.4])
  7. x.add_row(["Darwin", 112, 120900, 1714.7])
  8. x.add_row(["Hobart", 1357, 205556, 619.5])
  9. x.add_row(["Sydney", 2058, 4336374, 1214.8])
  10. x.add_row(["Melbourne", 1566, 3806092, 646.9])
  11. x.add_row(["Perth", 5386, 1554769, 869.4])
  12. x.del_row(6)
  13. x.del_row(5)
  14. x.del_row(4)
  15. x.del_row(3)
  16. print(x)

在示例中,我们删除最后四行。

  1. $ ./delete_rows.py
  2. +-----------+------+------------+-----------------+
  3. | City name | Area | Population | Annual Rainfall |
  4. +-----------+------+------------+-----------------+
  5. | Adelaide | 1295 | 1158259 | 600.5 |
  6. | Brisbane | 5905 | 1857594 | 1146.4 |
  7. | Darwin | 112 | 120900 | 1714.7 |
  8. +-----------+------+------------+-----------------+

前三行保留在输出中。

PrettyTable 清除数据

clear_rows()方法从表中删除所有行,但保留当前的列名。 clear()方法清除行名和列名。

clear_rows.py

  1. #!/usr/bin/python3
  2. from prettytable import PrettyTable
  3. x = PrettyTable()
  4. x.field_names = ["City name", "Area", "Population", "Annual Rainfall"]
  5. x.add_row(["Adelaide", 1295, 1158259, 600.5])
  6. x.add_row(["Brisbane", 5905, 1857594, 1146.4])
  7. x.add_row(["Darwin", 112, 120900, 1714.7])
  8. x.add_row(["Hobart", 1357, 205556, 619.5])
  9. x.add_row(["Sydney", 2058, 4336374, 1214.8])
  10. x.add_row(["Melbourne", 1566, 3806092, 646.9])
  11. x.add_row(["Perth", 5386, 1554769, 869.4])
  12. x.clear_rows()
  13. print(x)

该示例清除表中的所有行。

  1. $ ./clear_rows.py
  2. +-----------+------+------------+-----------------+
  3. | City name | Area | Population | Annual Rainfall |
  4. +-----------+------+------------+-----------------+
  5. +-----------+------+------------+-----------------+

这是示例的输出。 该表的标题不会被删除。

从 CSV 生成 PrettyTable

from_csv()方法可用于从 CSV 数据生成 PrettyTable。

data.csv

  1. "City name", "Area", "Population", "Annual Rainfall"
  2. "Adelaide", 1295, 1158259, 600.5
  3. "Brisbane", 5905, 1857594, 1146.4
  4. "Darwin", 112, 120900, 1714.7
  5. "Hobart", 1357, 205556, 619.5
  6. "Sydney", 2058, 4336374, 1214.8
  7. "Melbourne", 1566, 3806092, 646.9
  8. "Perth", 5386, 1554769, 869.4

data.csv包含用逗号分隔的数据。 请注意,第一行由表列名称组成。

read_from_csv.py

  1. #!/usr/bin/python3
  2. from prettytable import from_csv
  3. with open("data.csv", "r") as fp:
  4. x = from_csv(fp)
  5. print(x)

该示例从data.csv读取数据,并从中生成带有from_csv()的 PrettyTable。

从数据库游标生成 PrettyTable

from_db_cursor()方法从数据库游标生成 PrettyTable。

cities.sql

  1. DROP TABLE IF EXISTS Cities;
  2. CREATE TABLE Cities(Id INTEGER PRIMARY KEY, Name TEXT, Area INTEGER,
  3. Population INTEGER, Rainfall REAL);
  4. INSERT INTO Cities(Name, Area, Population, Rainfall) VALUES("Adelaide", 1295, 1158259, 600.5);
  5. INSERT INTO Cities(Name, Area, Population, Rainfall) VALUES("Brisbane", 5905, 1857594, 1146.4);
  6. INSERT INTO Cities(Name, Area, Population, Rainfall) VALUES("Darwin", 112, 120900, 1714.7);
  7. INSERT INTO Cities(Name, Area, Population, Rainfall) VALUES("Hobart", 1357, 205556, 619.5);
  8. INSERT INTO Cities(Name, Area, Population, Rainfall) VALUES("Sydney", 2058, 4336374, 1214.8);
  9. INSERT INTO Cities(Name, Area, Population, Rainfall) VALUES("Melbourne", 1566, 3806092, 646.9);
  10. INSERT INTO Cities(Name, Area, Population, Rainfall) VALUES("Perth", 5386, 1554769, 869.4);

这是一个 SQL 脚本,用于在 SQLite 数据库中创建Cities表。

  1. $ sqlite3 data.db
  2. sqlite> .read cities.sql
  3. sqlite> SELECT * FROM Cities;
  4. Id Name Area Population Rainfall
  5. ---------- ---------- ---------- ---------- ----------
  6. 1 Adelaide 1295 1158259 600.5
  7. 2 Brisbane 5905 1857594 1146.4
  8. 3 Darwin 112 120900 1714.7
  9. 4 Hobart 1357 205556 619.5
  10. 5 Sydney 2058 4336374 1214.8
  11. 6 Melbourne 1566 3806092 646.9
  12. 7 Perth 5386 1554769 869.4

我们阅读了cities.sql脚本,该脚本生成数据库表。

read_from_cursor.py

  1. #!/usr/bin/python3
  2. import sqlite3 as lite
  3. from prettytable import from_db_cursor
  4. con = lite.connect('data.db')
  5. with con:
  6. cur = con.cursor()
  7. cur.execute('SELECT * FROM Cities')
  8. x = from_db_cursor(cur)
  9. print(x)

在代码示例中,我们连接到data.db数据库并从Cities表中选择所有数据。 我们使用from_db_cursor()方法从游标生成一个 PrettyTable。

从 HTML 生成 PrettyTable

from_html()从一串 HTML 代码生成一个 PrettyTables 列表。 HTML 中的每个<table>都成为一个 PrettyTable 对象。 from_html_one()从仅包含单个<table>的 HTML 代码字符串中生成 PrettyTable。

data.html

  1. <html>
  2. <body>
  3. <table>
  4. <tr>
  5. <th>City name</th>
  6. <th>Area</th>
  7. <th>Population</th>
  8. <th>Annual Rainfall</th>
  9. </tr>
  10. <tr>
  11. <td>Adelaide</td>
  12. <td>1295</td>
  13. <td>1158259</td>
  14. <td>600.5</td>
  15. </tr>
  16. <tr>
  17. <td>Brisbane</td>
  18. <td>5905</td>
  19. <td>1857594</td>
  20. <td>1146.4</td>
  21. </tr>
  22. <tr>
  23. <td>Darwin</td>
  24. <td>112</td>
  25. <td>120900</td>
  26. <td>1714.7</td>
  27. </tr>
  28. <tr>
  29. <td>Hobart</td>
  30. <td>1357</td>
  31. <td>205556</td>
  32. <td>619.5</td>
  33. </tr>
  34. <tr>
  35. <td>Sydney</td>
  36. <td>2058</td>
  37. <td>4336374</td>
  38. <td>1214.8</td>
  39. </tr>
  40. <tr>
  41. <td>Melbourne</td>
  42. <td>1566</td>
  43. <td>3806092</td>
  44. <td>646.9</td>
  45. </tr>
  46. <tr>
  47. <td>Perth</td>
  48. <td>5386</td>
  49. <td>1554769</td>
  50. <td>869.4</td>
  51. </tr>
  52. </table>
  53. </body>
  54. </html>

在示例中,我们使用此 HTML 文件。

read_from_html.py

  1. #!/usr/bin/python3
  2. from prettytable import from_html_one
  3. with open("data.html", "r") as fp:
  4. html = fp.read()
  5. x = from_html_one(html)
  6. print(x)

该示例从data.html文件中读取数据,并使用from_html_one()方法生成一个 PrettyTable。

排序数据

使用sortby属性,我们将指定要排序的列。 reversesort属性控制排序的方向(升序还是降序)。

sorting.py

  1. #!/usr/bin/python3
  2. from prettytable import PrettyTable
  3. x = PrettyTable()
  4. x.field_names = ["City name", "Area", "Population", "Annual Rainfall"]
  5. x.add_row(["Adelaide", 1295, 1158259, 600.5])
  6. x.add_row(["Brisbane", 5905, 1857594, 1146.4])
  7. x.add_row(["Darwin", 112, 120900, 1714.7])
  8. x.add_row(["Hobart", 1357, 205556, 619.5])
  9. x.add_row(["Sydney", 2058, 4336374, 1214.8])
  10. x.add_row(["Melbourne", 1566, 3806092, 646.9])
  11. x.add_row(["Perth", 5386, 1554769, 869.4])
  12. print("Table sorted by population:")
  13. x.sortby = "Population"
  14. print(x)
  15. print()
  16. print("Table sorted by city in descendig order:")
  17. x.sortby = "City name"
  18. x.reversesort = True
  19. print(x)

在示例中,我们对表的数据进行排序。

  1. print("Table sorted by population:")
  2. x.sortby = "Population"

首先,我们按总体升序对数据进行排序。

  1. x.sortby = "City name"
  2. x.reversesort = True

然后,我们按照城市名称的降序对数据进行排序。

  1. $ ./sorting.py
  2. Table sorted by population:
  3. +-----------+------+------------+-----------------+
  4. | City name | Area | Population | Annual Rainfall |
  5. +-----------+------+------------+-----------------+
  6. | Darwin | 112 | 120900 | 1714.7 |
  7. | Hobart | 1357 | 205556 | 619.5 |
  8. | Adelaide | 1295 | 1158259 | 600.5 |
  9. | Perth | 5386 | 1554769 | 869.4 |
  10. | Brisbane | 5905 | 1857594 | 1146.4 |
  11. | Melbourne | 1566 | 3806092 | 646.9 |
  12. | Sydney | 2058 | 4336374 | 1214.8 |
  13. +-----------+------+------------+-----------------+
  14. Table sorted by city in descendig order:
  15. +-----------+------+------------+-----------------+
  16. | City name | Area | Population | Annual Rainfall |
  17. +-----------+------+------------+-----------------+
  18. | Sydney | 2058 | 4336374 | 1214.8 |
  19. | Perth | 5386 | 1554769 | 869.4 |
  20. | Melbourne | 1566 | 3806092 | 646.9 |
  21. | Hobart | 1357 | 205556 | 619.5 |
  22. | Darwin | 112 | 120900 | 1714.7 |
  23. | Brisbane | 5905 | 1857594 | 1146.4 |
  24. | Adelaide | 1295 | 1158259 | 600.5 |
  25. +-----------+------+------------+-----------------+

这是输出。

数据对齐

align属性控制字段的对齐方式。 其可能的值为lcr

alignment.py

  1. #!/usr/bin/python3
  2. from prettytable import PrettyTable
  3. x = PrettyTable()
  4. x.field_names = ["City name", "Area", "Population", "Annual Rainfall"]
  5. x.align["City name"] = "l"
  6. x.align["Area"] = "r"
  7. x.align["Annual Rainfall"] = "r"
  8. x.add_row(["Adelaide", 1295, 1158259, 600.5])
  9. x.add_row(["Brisbane", 5905, 1857594, 1146.4])
  10. x.add_row(["Darwin", 112, 120900, 1714.7])
  11. x.add_row(["Hobart", 1357, 205556, 619.5])
  12. x.add_row(["Sydney", 2058, 4336374, 1214.8])
  13. x.add_row(["Melbourne", 1566, 3806092, 646.9])
  14. x.add_row(["Perth", 5386, 1554769, 869.4])
  15. print(x)

该代码示例在表格列中对齐数据。

  1. x.align["City name"] = "l"

我们将City name列中的字段对齐到左侧。

  1. x.align["Area"] = "r"
  2. x.align["Annual Rainfall"] = "r"

我们将AreaAnnual Rainfall中的字段右对齐。

  1. $ ./alignment.py
  2. +-----------+------+------------+-----------------+
  3. | City name | Area | Population | Annual Rainfall |
  4. +-----------+------+------------+-----------------+
  5. | Adelaide | 1295 | 1158259 | 600.5 |
  6. | Brisbane | 5905 | 1857594 | 1146.4 |
  7. | Darwin | 112 | 120900 | 1714.7 |
  8. | Hobart | 1357 | 205556 | 619.5 |
  9. | Sydney | 2058 | 4336374 | 1214.8 |
  10. | Melbourne | 1566 | 3806092 | 646.9 |
  11. | Perth | 5386 | 1554769 | 869.4 |
  12. +-----------+------+------------+-----------------+

这是输出。

HTML 输出

get_html_string()从 PrettyTable 生成 HTML 输出。

html_output.py

  1. #!/usr/bin/python3
  2. from prettytable import PrettyTable
  3. x = PrettyTable(["City name", "Area", "Population", "Annual Rainfall"])
  4. x.add_row(["Adelaide",1295, 1158259, 600.5])
  5. x.add_row(["Brisbane",5905, 1857594, 1146.4])
  6. x.add_row(["Darwin", 112, 120900, 1714.7])
  7. x.add_row(["Hobart", 1357, 205556, 619.5])
  8. x.add_row(["Sydney", 2058, 4336374, 1214.8])
  9. x.add_row(["Melbourne", 1566, 3806092, 646.9])
  10. x.add_row(["Perth", 5386, 1554769, 869.4])
  11. print(x.get_html_string())

该示例将 HTML 表中的数据打印到控制台。

get_string方法

get_string()方法返回当前状态下的表的字符串表示形式。 它有几个选项可以控制表格的显示方式。

显示标题

使用title参数,我们可以在输出中包括表标题。

table_title.py

  1. #!/usr/bin/python3
  2. from prettytable import PrettyTable
  3. x = PrettyTable(["City name", "Area", "Population", "Annual Rainfall"])
  4. x.add_row(["Adelaide",1295, 1158259, 600.5])
  5. x.add_row(["Brisbane",5905, 1857594, 1146.4])
  6. x.add_row(["Darwin", 112, 120900, 1714.7])
  7. x.add_row(["Hobart", 1357, 205556, 619.5])
  8. x.add_row(["Sydney", 2058, 4336374, 1214.8])
  9. x.add_row(["Melbourne", 1566, 3806092, 646.9])
  10. x.add_row(["Perth", 5386, 1554769, 869.4])
  11. print(x.get_string(title="Australian cities"))

该示例创建一个带标题的 PrettyTable。

  1. $ ./table_title.py
  2. +-------------------------------------------------+
  3. | Australian cities |
  4. +-----------+------+------------+-----------------+
  5. | City name | Area | Population | Annual Rainfall |
  6. +-----------+------+------------+-----------------+
  7. | Adelaide | 1295 | 1158259 | 600.5 |
  8. | Brisbane | 5905 | 1857594 | 1146.4 |
  9. | Darwin | 112 | 120900 | 1714.7 |
  10. | Hobart | 1357 | 205556 | 619.5 |
  11. | Sydney | 2058 | 4336374 | 1214.8 |
  12. | Melbourne | 1566 | 3806092 | 646.9 |
  13. | Perth | 5386 | 1554769 | 869.4 |
  14. +-----------+------+------------+-----------------+

这是输出。

选择列

使用fields选项,我们可以选择将要显示的列。

select_columns.py

  1. #!/usr/bin/python3
  2. from prettytable import PrettyTable
  3. x = PrettyTable(["City name", "Area", "Population", "Annual Rainfall"])
  4. x.add_row(["Adelaide",1295, 1158259, 600.5])
  5. x.add_row(["Brisbane",5905, 1857594, 1146.4])
  6. x.add_row(["Darwin", 112, 120900, 1714.7])
  7. x.add_row(["Hobart", 1357, 205556, 619.5])
  8. x.add_row(["Sydney", 2058, 4336374, 1214.8])
  9. x.add_row(["Melbourne", 1566, 3806092, 646.9])
  10. x.add_row(["Perth", 5386, 1554769, 869.4])
  11. print(x.get_string(fields=["City name", "Population"]))

在该示例中,我们仅显示City namePopulation列。

  1. $ ./select_columns.py
  2. +-----------+------------+
  3. | City name | Population |
  4. +-----------+------------+
  5. | Adelaide | 1158259 |
  6. | Brisbane | 1857594 |
  7. | Darwin | 120900 |
  8. | Hobart | 205556 |
  9. | Sydney | 4336374 |
  10. | Melbourne | 3806092 |
  11. | Perth | 1554769 |
  12. +-----------+------------+

选择行

使用startend参数,我们可以选择在输出中显示哪些行。

select_rows.py

  1. #!/usr/bin/python3
  2. from prettytable import PrettyTable
  3. x = PrettyTable(["City name", "Area", "Population", "Annual Rainfall"])
  4. x.add_row(["Adelaide",1295, 1158259, 600.5])
  5. x.add_row(["Brisbane",5905, 1857594, 1146.4])
  6. x.add_row(["Darwin", 112, 120900, 1714.7])
  7. x.add_row(["Hobart", 1357, 205556, 619.5])
  8. x.add_row(["Sydney", 2058, 4336374, 1214.8])
  9. x.add_row(["Melbourne", 1566, 3806092, 646.9])
  10. x.add_row(["Perth", 5386, 1554769, 869.4])
  11. print(x.get_string(start=1, end=4))

在示例中,我们在输出中仅包括三行。

  1. $ ./select_rows.py
  2. +-----------+------+------------+-----------------+
  3. | City name | Area | Population | Annual Rainfall |
  4. +-----------+------+------------+-----------------+
  5. | Brisbane | 5905 | 1857594 | 1146.4 |
  6. | Darwin | 112 | 120900 | 1714.7 |
  7. | Hobart | 1357 | 205556 | 619.5 |
  8. +-----------+------+------------+-----------------+

这是示例的输出。

在本教程中,我们已使用 PrettyTable 库在 Python 中生成 ASCII 表。

您可能也会对以下相关教程感兴趣: Python CSV 教程Tkinter 教程SymPy 教程Python Pillow 教程Matplotlib 教程Python 教程