文件存储数据

一.以Word形式存储

1.环境安装

安装python-docx库,使用命令:

复制代码
pip install python-docx

如果需要在Windows下调用Word应用程序本身,比如处理.doc格式或者加密,需要用到pywin32库

复制代码
pip install pywin32

但是使用python-docx是最主流的方式,虽然只使用于.docx格式的Word文件,但是python-docx支持跨平台使用,并且容易上手。

两种库的对比:

特性 python-docx win32com.client
跨平台性 ✅ 支持 Windows/Linux/Mac ❌ 仅支持 Windows
文件格式 仅支持 .docx 支持 .doc.docx
学习难度 简单,API 直观 较难,需了解 COM 对象
主要优势 轻量级,适合生成和修改内容 功能极强,可加密、转PDF、调用宏
适用场景 自动生成报告、简历、批量替换 办公自动化(OA)深度集成、文档加密

2.python-docx库的使用

前言:

python-docx将Word文档看成一个树形结构,主要有三个层级:

  • Document(文档):代表整个.docx文件,是容器
  • Paragraph(段落):表示文本中的文本块,注意:每次回车都会产生一个新段落
  • Run(文本块):段落中具有相同样式的一段文本。比如一个段落里既有粗体又有斜体,它们就是不同的Run

1.基本使用:创建和保存文档

python 复制代码
from docx import Document
#创建文件对象(创建一个新的空白文档)
doc = Document()
# print(doc)#<docx.document.Document object at 0x000001644C502270>
# print(type(doc))#<class 'docx.document.Document'>
#保存文档,填写文档的名称
doc.save('output.docx')

2.基本使用:写入文本与标题

python 复制代码
from docx import Document
#创建文件对象(创建一个新的空白文档)
doc = Document()
#---添加标题---
#level=0是文档标题,无缩进;level=1是标题1;以此类推...
doc.add_heading("这是我的第一个Word文档",level=0)
doc.add_heading("第一章:入门指南",level=1)
#---添加普通段落---
doc.add_paragraph("这是一个普通段落")
#保存文档,填写文档的名称
doc.save('output.docx')

效果:

3.Paragraph类的.add_run方法

Paragraph类的.add_run()方法用于:

在一个段落(Paragraph)里添加一段具有独立样式的文本块(Run)

python 复制代码
from docx import Document
from docx.shared import RGBColor
#打开一个.docx文件
doc = Document('output.docx')
#创建一个空的段落
paragraph = doc.add_paragraph()
#在该段落中添加多个Run
run1 = paragraph.add_run('普通文本')
run2 = paragraph.add_run('加粗文本')
run2.bold = True#设置加粗
run3 = paragraph.add_run('红色文本')
run3.font.color.rgb = RGBColor(255,0,0)
#注意:python-docx对文档的修改只存在于内存中,必须显式调用.save()才会将修改的内容存入磁盘
doc.save("output.docx")

效果:

4.插入表格

1.最基础的:插入空表格
python 复制代码
from docx import Document
#读入存在的docx文件
doc = Document('output.docx')
#添加一个3行2列的表格
table = doc.add_table(rows=3, cols=2)#创建的是空表格
doc.save('output.docx')

效果:

2.填充表格内容
方法1:通过cell(row,col).text直接赋值(最常用)
python 复制代码
from docx import Document
#读入存在的docx文件
doc = Document('output.docx')
#添加一个3行2列的表格
table = doc.add_table(rows=3, cols=2)
#填充表格内容
##设置表头
table.cell(0,0).text = "姓名"
table.cell(0,1).text = "年龄"
##设置数据行
table.cell(1,0).text = "张三"
table.cell(1,1).text = '25'
table.cell(2,0).text = "李四"
table.cell(2,1).text = '30'
doc.save('output.docx')

效果:

方法2:遍历并批量填充
python 复制代码
from docx import Document
doc = Document('output.docx')
data = [
    ['姓名', '年龄', '城市'],
    ['张三', '25', '北京'],
    ['李四', '30', '上海'],
    ['王五', '28', '广州']
]

# 先创建表格(行数 = len(data),列数 = len(data[0]))
table = doc.add_table(rows=len(data), cols=len(data[0]))

# 填充数据
for i, row_data in enumerate(data):
    for j, cell_text in enumerate(row_data):
        table.cell(i, j).text = cell_text

doc.save('output.docx')

效果:

5.设置表格样式

📌 常用内置样式名(注意大小写!)

样式名称(英文) 效果
'Table Grid' 最常用!带完整边框的网格表
'Light Shading' 表头浅灰底纹
'Colorful Grid' 彩色边框(依赖 Office 主题)
'Medium Shading 1' 表头深色底纹 + 隔行变色
'Plain Table 1' ~ 'Plain Table 5' 简洁无底纹,不同边框风格

💡 如何获取准确的样式名?

  1. 在 Word 中手动创建一个表格
  2. 应用你想要的样式
  3. 右键表格 → "表格属性" → "边框和底纹" → 查看"样式"名称
  4. 或直接使用上面列出的通用名称(跨版本兼容性好)

这里就只为第2个表格设置样式

python 复制代码
from docx import Document
doc = Document('output.docx')
#遍历所有表格?可以!但我只想为第二个表格设置样式
if doc.tables:#确保文档中有表格
    seconde_table = doc.tables[1]
    seconde_table.style = 'Table Grid'#最常用的样式,带完整边框的网格表
doc.save('output.docx')#也可以换一个新的文件名,即把修改的内容存储到新的文件中,避免对原始文件进行修改

效果:

6.插入图片

1.最基本的插入
python 复制代码
from docx import Document
doc = Document('output.docx')
#插入图片(自动按原始比例进行缩放)
doc.add_picture('../../Picture/OIP-C.jpg')#这里的路径很容易搞错
doc.save('output.docx')

注意:我的py文件是在"文件存储"这个文件夹下的子文件夹"Word文件"中的,而图片是存放在与文件存储这个文件夹的同级目录的"Picture"这个文件夹中的

使用".."(表示上级目录)来表示图片的正确路径!!!

效果:

2.控制图片尺寸

可以指定插入图片的宽度(width)或高度(height),另一个维度会自动按比例缩放

如果同时指定宽高,图片会被拉伸(可能变形)

python 复制代码
from docx import Document
from docx.shared import Cm#也可以导入Inches用英寸来设置
doc = Document('output.docx')
doc.add_picture("../../Picture/OIP-C.jpg", width=Cm(5))#设置图片宽度为5cm
doc.save('output.docx')

效果:

3.将图片插入到特定位置

Document类的add_picture()方法默认在文档末尾添加一个独立段落来用于插入图片

如果希望图片出现在某段文字中间,需要:

  • 先创建段落
  • 在段落中通过add_run().add_picture()插入
1.设置图片位于文字中间
python 复制代码
from docx import Document
from docx.shared import Cm
doc = Document("output.docx")
p = doc.add_paragraph()#先创建一个空段落
# print(type(p))#<class 'docx.text.paragraph.Paragraph'>
# print(type(p.add_run()))#<class 'docx.text.run.Run'>
p.add_run("这是左边文字")
p.add_run().add_picture('../../Picture/OIP-C.jpg', width=Cm(5))#add_run()后要直接调用add_picture()
p.add_run("这是右边文字")
doc.save("output.docx")

为什么add_run()后要直接调用add_picture()方法?

因为Run类的对象(由add_run()返回)本身是没有add_picture()方法的!

python 复制代码
run = p.add_run()
run.add_picture(...)  # ❌ 这样会报错!

效果:

2.设置图片对齐方式

其他对齐选项:

  • WD_ALIGN_PARAGRAPH.LEFT(默认)
  • WD_ALIGN_PARAGRAPH.RIGHT
  • WD_ALIGN_PARAGRAPH.CENTER
  • WD_ALIGN_PARAGRAPH.JUSTIFY(设置段落对齐方式为两端对齐)

图片本身在一个段落当中,所以通过该段落设置对齐即可

python 复制代码
from docx import Document
from docx.shared import Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH
doc = Document("output.docx")
#插入图片并居中
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p.add_run().add_picture('../../Picture/picture1.png', width=Cm(5))
doc.save('output.docx')

效果:

4.插入图片的常见问题

❗ 常见问题

问题 解决方案
图片不显示 / 显示为红叉 路径错误,或保存后移动了图片文件(Word 嵌入图片,但调试时注意路径)
图片太大超出页面 width=Cm(15) 限制宽度(A4 纸宽约 18cm)
想环绕文字? python-docx 不支持文字环绕(Word 的"嵌入型"以外的布局),图片只能独占一行或在行内
插入网络图片? 需先下载到本地,再插入
5.插入网络图片

python-docx的add_picture()不支持直接传入URL,如果有网络图片需要插入,需先下载到本地

或者:

python-docx支持BytesIO对象!所以可以从内存中插入图片,无需保存到磁盘!

python 复制代码
import requests
from docx import Document
from docx.shared import Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH
from io import BytesIO#导入BytesIO类,用于在内存中创建一个类似文件的对象(file-like object),但不实际读写磁盘文件而是操作字节数据(bytes)

response = requests.get('https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png')
image_stream = BytesIO(response.content)
doc = Document('output.docx')
p = doc.add_paragraph()
p.add_run('百度logo:')
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p.add_run().add_picture(image_stream, width=Cm(10))
doc.save('output.docx')

效果:

✅ 总结:from io import BytesIO 的作用

用途 说明
内存中模拟文件 创建一个像文件一样可读写的对象,但数据存在 RAM 中
避免临时文件 下载/生成图片后直接使用,无需写入磁盘再读取
python-docx 配合 add_picture() 支持从内存插入图片
提高性能 & 安全性 减少磁盘操作,适合 Web 服务、自动化脚本

7.设置文字样式与大小

python-docx 中,不能直接对段落(Paragraph)整体设置字体样式和大小 ,而是要通过 Run(文本运行)对象 来控制文字的格式。

需导入:

python 复制代码
from docx.shared import Pt, RGBColor
from docx.enum.text import WD_COLOR_INDEX  # 用于高亮

🎨 常用文字样式设置

属性 说明 示例
run.bold 加粗 run.bold = True
run.italic 斜体 run.italic = True
run.underline 下划线 run.underline = True
run.font.size 字号 run.font.size = Pt(12)
run.font.color.rgb 颜色 RGBColor(0, 0, 255)(蓝)
run.font.name 西文字体 'Arial', 'Times New Roman'
run.font.highlight_color 高亮背景 WD_COLOR_INDEX.YELLOW

✅ 总结

目标 操作
设置文字样式 操作 Run 对象,不是 Paragraph
设置字号 run.font.size = Pt(14)
设置中文字体 同时设置 font.nameeastAsia
加粗/颜色等 run.bold = True, run.font.color.rgb = RGBColor(...)
相关推荐
这个人懒得名字都没写5 分钟前
Python包管理新纪元:uv
python·conda·pip·uv
有泽改之_6 分钟前
leetcode146、OrderedDict与lru_cache
python·leetcode·链表
是毛毛吧30 分钟前
边打游戏边学Python的5个开源项目
python·开源·github·开源软件·pygame
三途河畔人1 小时前
Pytho基础语法_运算符
开发语言·python·入门
独行soc2 小时前
2025年渗透测试面试题总结-275(题目+回答)
网络·python·安全·web安全·网络安全·渗透测试·安全狮
番石榴AI4 小时前
java版的ocr推荐引擎——JiaJiaOCR 2.0重磅升级!纯Java CPU推理,新增手写OCR与表格识别
java·python·ocr
时光轻浅,半夏挽歌4 小时前
python不同格式文件的读写方式(json等)
python·json
测试人社区-千羽5 小时前
边缘计算场景下的智能测试挑战
人工智能·python·安全·开源·智能合约·边缘计算·分布式账本
抽象带篮子5 小时前
Pytorch Lightning 框架运行顺序
人工智能·pytorch·python
哇哈哈&5 小时前
安装wxWidgets3.2.0(编译高版本erlang的时候用,不如用rpm包),而且还需要高版本的gcc++19以上,已基本舍弃
linux·数据库·python