Bootstrap

Python精选200Tips:131-135

喝了这碗,还有一碗,就该上道了

运行系统:macOS Sonoma 14.6.1
Python编译器:PyCharm 2024.1.4 (Community Edition)
Python版本:3.12

往期链接:

1-5 6-10 11-20 21-30 31-40 41-50
51-60:函数 61-70:类 71-80:编程范式及设计模式
81-90:Python编码规范 91-100:Python自带常用模块-1
101-105:Python自带模块-2 106-110:Python自带模块-3
111-115:Python常用第三方包-频繁使用 116-120:Python常用第三方包-深度学习
121-125:Python常用第三方包-爬取数据 126-130:Python常用第三方包-为了乐趣

本文只介绍每个包主要做什么及一些比较经典的示例。对于包的进一步学习,推荐参考对应包的官方文档。

131 python-docx - 创建和修改文档的库

python-docx版本1.1.2,官方文档

python-docx 是一个用于创建和修改 Microsoft Word 2007 及以上版本(.docx 格式)文档的 Python 库。它允许用户以编程方式生成复杂的文档,支持文本、样式、图像、表格等多种内容。

基本功能
  • 创建新文档。
  • 读取和修改现有文档。
  • 添加段落、标题、列表、表格、图像等。
  • 设置文本格式(如加粗、斜体、字体大小等)。
  • 导出文档为 .docx 格式。
主要类和方法
  • Document:主类,用于创建和操作文档。
    (1) add_paragraph(text): 添加段落。
    (2) add_heading(text, level): 添加标题。
    (3)add_table(rows, cols): 添加表格。
    (4)add_picture(image_path): 添加图片。
    (5)save(file_path): 保存文档。
  • Paragraph:代表文档中的段落。
  • Run:代表段落中的文本块,可以设置不同的样式。
  • Table:代表文档中的表格。
示例
from docx import Document
from docx.shared import Inches
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT

# 创建文档
doc = Document()

# 添加标题
doc.add_heading('项目报告', level=1)

# 添加作者和日期
doc.add_paragraph('作者:张三')
doc.add_paragraph('日期:2024年9月12日')

# 添加简介段落
doc.add_heading('简介', level=2)
intro = doc.add_paragraph(
    '本项目旨在开发一个用于管理和跟踪项目的应用程序。'
    '我们的目标是提高团队的协作效率和项目管理能力。'
)

# 添加有序列表
doc.add_heading('项目目标', level=2)
goals = doc.add_paragraph('1. 提升团队协作能力', style='ListNumber')
goals.add_run('\n2. 提高项目管理效率').bold = True
goals.add_run('\n3. 实现任务的可视化跟踪')

# 添加无序列表
doc.add_heading('关键功能', level=2)
doc.add_paragraph('• 任务分配', style='ListBullet')
doc.add_paragraph('• 进度跟踪', style='ListBullet')
doc.add_paragraph('• 报告生成', style='ListBullet')

# 添加表格
doc.add_heading('项目时间表', level=2)
table = doc.add_table(rows=1, cols=4)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = '阶段'
hdr_cells[1].text = '开始日期'
hdr_cells[2].text = '结束日期'
hdr_cells[3].text = '责任人'

# 添加数据到表格
data = [
    ('需求分析', '2024-01-01', '2024-01-15', 'Alice'),
    ('设计阶段', '2024-01-16', '2024-02-01', 'Bob'),
    ('开发阶段', '2024-02-02', '2024-04-01', 'Charlie'),
    ('测试阶段', '2024-04-02', '2024-05-01', 'David'),
]

for stage, start, end, person in data:
    row_cells = table.add_row().cells
    row_cells[0].text = stage
    row_cells[1].text = start
    row_cells[2].text = end
    row_cells[3].text = person

# 设置表格样式
for row in table.rows:
    for cell in row.cells:
        cell.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER

# 添加图片
doc.add_heading('项目示意图', level=2)
doc.add_picture('example.png', width=Inches(5))  # 确保该图片文件存在

# 添加总结段落
doc.add_heading('总结', level=2)
doc.add_paragraph(
    '通过本项目的实施,我们期望能够显著提高团队的协作效率和项目管理能力。'
)

# 保存文档
doc.save('project_report.docx')

在这里插入图片描述

132 NetworkX - 网络分析和图论工具

NetworkX版本3.3,官方文档

NetworkX 是一个用于创建、操作和研究复杂网络的 Python 库。它提供了丰富的功能来处理图(图论中的数学结构)和网络,包括图的生成、分析、可视化等。主要模块:

  • 图的创建与操作
    (1)创建无向图、有向图和权重图。
    (2)添加和删除节点和边。
  • 图的属性
    (1)节点和边的属性可以通过字典形式存储。
    (2)支持多种图类型,如简单图、重图、带权图等。
  • 图的分析
    提供多种算法,如最短路径算法、连通性、中心性、聚类系数等。
  • 图的可视化
    使用 Matplotlib 或其他库进行图的可视化。
  • 图的生成
    提供多种图生成模型,如随机图、巴拉巴西-阿尔伯特模型等。
示例1: 小世界网络
import networkx as nx
import matplotlib.pyplot as plt

# 1. 创建一个 Watts-Strogatz 小世界网络
n = 100  # 节点数
k = 6    # 每个节点连接的邻居数
p = 0.1  # 重连概率
G = nx.watts_strogatz_graph(n, k, p)

# 2. 计算网络指标
degree_centrality = nx.degree_centrality(G)

# 3. 可视化网络
plt.figure(figsize=(12, 10))

# 使用 spring 布局
pos = nx.spring_layout(G, seed=42)

# 根据中心性设置节点大小和颜色
node_sizes = [v * 1000 for v in degree_centrality.values()]
node_colors = [degree_centrality[node] for node in G.nodes()]

# 绘制边
nx.draw_networkx_edges(G, pos, alpha=0.5, edge_color='gray')

# 绘制节点
nodes = nx.draw_networkx_nodes(G, pos, node_size=node_sizes, node_color=node_colors, cmap=plt.cm.viridis)

# 添加 colorbar
sm = plt.cm.ScalarMappable(cmap=plt.cm.viridis, norm=plt.Normalize(vmin=min(node_colors), vmax=max(node_colors)))
sm.set_array([])  # 必须设置数组
cbar = plt.colorbar(sm, ax=plt.gca(), label='Degree Centrality')

# 添加标签
nx.draw_networkx_labels(G, pos, font_size=8)

# 设置标题
plt.title('Watts-Strogatz Small-World Network Visualization', fontsize=16)
plt.axis('off')  # 关闭坐标轴
plt.show()

在这里插入图片描述

示例2:社交网络分析
import networkx as nx
import matplotlib.pyplot as plt

# 1. 创建一个社交网络
G = nx.Graph()

# 添加节点(用户)
users = ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace', 'Heidi', 'Ivan', 'Judy']
G.add_nodes_from(users)

# 添加边(朋友关系)
edges = [
    ('Alice', 'Bob'),
    ('Alice', 'Charlie'),
    ('Bob', 'David'),
    ('Charlie', 'David'),
    ('Charlie', 'Eve'),
    ('David', 'Frank'),
    ('Eve', 'Grace'),
    ('Frank', 'Grace'),
    ('Grace', 'Heidi'),
    ('Heidi', 'Ivan'),
    ('Judy', 'Alice'),
    ('Judy', 'Bob'),
]
G.add_edges_from(edges)

# 2. 计算网络指标
degree_centrality = nx.degree_centrality(G)

# 3. 可视化网络
plt.figure(figsize=(10, 8))

# 使用 spring 布局
pos = nx.spring_layout(G, seed=42)

# 根据中心性设置节点大小和颜色
node_sizes = [v * 1000 for v in degree_centrality.values()]
node_colors = [degree_centrality[node] for node in G.nodes()]

# 绘制边
nx.draw_networkx_edges(G, pos, alpha=0.5, edge_color='gray')

# 绘制节点
nodes = nx.draw_networkx_nodes(G, pos, node_size=node_sizes, node_color=node_colors, cmap=plt.cm.viridis)

# 添加 colorbar
sm = plt.cm.ScalarMappable(cmap=plt.cm.viridis, norm=plt.Normalize(vmin=min(node_colors), vmax=max(node_colors)))
sm.set_array([])  # 必须设置数组
cbar = plt.colorbar(sm, ax=plt.gca(), label='Degree Centrality')

# 添加标签
nx.draw_networkx_labels(G, pos, font_size=10)

# 标注最重要的节点
top_nodes = sorted(degree_centrality.items(), key=lambda x: x[
;