当前位置:

首页 > 编程开发 > Python操作Word文档属性与字数统计的方法详解

Python操作Word文档属性与字数统计的方法详解

使用python-docx库读取Word文档核心属性(标题、作者等),遍历段落、表格、页眉页脚统计字符数。批量脚本自动提取多份文档信息,实现高效办公自动化。

小李是刚入职场的行政助理,这天领导扔给他30份项目报告,要求统计每份报告的字数,还要提取创建时间和最后修改作者。遇到这种场景,不少人第一反应是手动打开一个个Word文档,复制粘贴。但小李选择了另一个思路——用Python搞定。说实话,30份文档手动操作,不仅效率低,还容易出错,自动化处理才是正经解法。

准备工作:安装与导入

操作Word文档,最常用的库是python-docx。不过有一点需要留意:它只支持.docx格式,如果手头还有老旧的.doc文件,得先转换一下格式再处理。

pip install python-docx

安装完成后,在代码中导入。处理日期时间还需要datetime库:

from docx import Document
from datetime import datetime

读取文档属性

Word文档的属性就像文件的“身份证”,记录了标题、作者、创建时间、修改次数等信息。这些信息藏在文档的“Core Properties”部分,python-docx可以轻松读取。

def get_doc_properties(doc_path):
    doc = Document(doc_path)
    core_props = doc.core_properties
    
    info = {
        "标题": core_props.title,
        "作者": core_props.author,
        "分类": core_props.category,
        "状态": core_props.content_status,
        "创建时间": core_props.created,
        "修改时间": core_props.modified,
        "最后保存者": core_props.last_modified_by,
        "修订次数": core_props.revision
    }
    return info

props = get_doc_properties("项目报告.docx")
for key, value in props.items():
    print(f"{key}: {value}")

跑完这段代码,输出结果大致是这样的:

标题: 2024年度项目总结

作者: 张三

创建时间: 2024-12-01 10:30:00

最后保存者: 李四

修订次数: 5

这里有个小细节:created和modified返回的是datetime对象,用strftime格式化一下就能输出你想要的日期格式。

字数统计:主体内容

字数统计这块,稍微要复杂一点。文档里的文字分散在不同的地方:段落、表格、页眉页脚、文本框。先从最常见的段落和表格入手。

def count_word_document(doc_path):
    doc = Document(doc_path)
    
    total_chars = 0
    
    for paragraph in doc.paragraphs:
        text = paragraph.text.strip()
        total_chars += len(text)
    
    for table in doc.tables:
        for row in table.rows:
            for cell in row.cells:
                text = cell.text.strip()
                total_chars += len(cell.text)
    
    return total_chars

word_count = count_word_document("项目报告.docx")
print(f"文档总字符数: {word_count}")

这里用len(text)统计字符数。对中文来说,每个汉字算1个字符。如果是英文场景,可能需要按空格分词来统计单词数,用len(text.split())就能搞定。

进阶字数统计:包含页眉页脚

页眉页脚往往藏着重要信息,比如公司名称、文档版本。把这些也统计进来,字数会更完整。

def count_with_headers(doc_path):
    doc = Document(doc_path)
    total_chars = 0
    
    for paragraph in doc.paragraphs:
        total_chars += len(paragraph.text)
    
    for table in doc.tables:
        for row in table.rows:
            for cell in row.cells:
                total_chars += len(cell.text)
    
    for section in doc.sections:
        header = section.header
        for paragraph in header.paragraphs:
            total_chars += len(paragraph.text)
        
        footer = section.footer
        for paragraph in footer.paragraphs:
            total_chars += len(paragraph.text)
    
    return total_chars

通过doc.sections遍历每个节,再分别访问页眉和页脚的段落,就能把隐藏的文字也捞出来。

注意事项

段落与Run的区别:python-docx把一段文字拆成多个Run对象,每个Run是一段样式相同的连续文本。直接取paragraph.text会合并所有Run的文本,对字数统计没影响。但如果要统计带格式的文字数量,可以遍历paragraph.runs分别处理。

性能问题:几十上百页的文档,遍历所有表格和段落没问题。上千页的超长文档,建议分页读取或换用更底层的lxml直接解析XML。

分页统计:python-docx本身不提供精确的页数统计。如果依赖分页符来分页,可以用paragraph.contains_page_break判断:

def estimate_pages(doc_path):
    doc = Document(doc_path)
    page_breaks = sum(1 for p in doc.paragraphs if p.contains_page_break)
    return page_breaks + 1

这种方法只对手动插入分页符的文档有效,纯自动排版的文档会返回1。

完整示例:批量处理脚本

把上面内容整合成一个批量处理脚本:

import os
from docx import Document
from datetime import datetime

def analyze_doc(doc_path):
    try:
        doc = Document(doc_path)
        props = doc.core_properties
        
        char_count = 0
        for para in doc.paragraphs:
            char_count += len(para.text)
        for table in doc.tables:
            for row in table.rows:
                for cell in row.cells:
                    char_count += len(cell.text)
        
        return {
            "文件": os.path.basename(doc_path),
            "字符数": char_count,
            "作者": props.author,
            "创建时间": props.created.strftime("%Y-%m-%d") if props.created else "未知"
        }
    except Exception as e:
        print(f"处理失败 {doc_path}: {e}")
        return None

folder = "./reports"
for filename in os.listdir(folder):
    if filename.endswith(".docx"):
        full_path = os.path.join(folder, filename)
        result = analyze_doc(full_path)
        if result:
            print(f"{result['文件']} - {result['字符数']}字 - {result['作者']}")

跑一遍脚本,30份报告的字数和作者信息就全部提取出来了。小李把结果导出到Excel,圆满完成了任务。

总结

用python-docx处理Word文档属性与字数统计,核心就三点:doc.core_properties获取元数据、遍历doc.paragraphs和doc.tables统计文字、doc.sections访问页眉页脚。代码量不大,却能把重复劳动彻底自动化。下次领导再丢来一堆文档,就知道怎么优雅应对了。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发 Python
相关文章 更多
codekit环境配置指南从安装到环境搭建完整教程
codekit环境配置指南从安装到环境搭建完整教程

详解 CodeKit 在 macOS 下的安装步骤、项目导入方法、Sass与JavaScript编译设置及浏览器自动刷新功能,助您快速搭建高效的前端开发环境。

codex安装windows 命令行完整操作教程
codex安装windows 命令行完整操作教程

详解Windows环境下安装OpenAI Codex CLI的步骤,包括WSL环境检查、Node.js/npm配置、npm全局安装命令及首次启动验证,适合开发者快速上手。

NativeRest环境配置要求与完整操作教程
NativeRest环境配置要求与完整操作教程

学习如何配置 NativeRest REST API 客户端。涵盖 Windows/macOS/Linux 安装后的工作区创建、环境变量管理、请求编辑及响应查看步骤,帮助开发者快速完成基础环境搭建与连通性测试。

CSS设置透明度的注意事项有哪些?opacity属性详解
CSS设置透明度的注意事项有哪些?opacity属性详解

深入解析CSS中设置透明度的核心属性opacity,剖析子元素继承、事件穿透、层叠上下文等关键注意事项,并提供与rgba、hsla的实用选型对比。

flutter页面传值到后台的方法及示例代码
flutter页面传值到后台的方法及示例代码

flutter页面传值到后台的完整实现方法及示例代码,帮助读者快速掌握相关技术要点。

Java 8至21新特性代码写法对比:Lambda、Record与Switch
Java 8至21新特性代码写法对比:Lambda、Record与Switch

本文通过具体的旧版与新版代码对比,详细剖析Java 8引入的Lambda表达式、Java 14/16引入的Record类,以及Java 12至21逐步演进完善的Switch表达式与模式匹配,展示代码简化路径与避坑要点。

AI智能体开发培训课程学什么及实战内容介绍
AI智能体开发培训课程学什么及实战内容介绍

系统梳理AI智能体开发培训的核心知识模块、技术栈选型与典型实战项目,解析低代码平台与纯代码框架的差异,提供从零构建可落地智能体的完整学习与实施路径。

Java子类未实现抽象方法编译错误修复指南
Java子类未实现抽象方法编译错误修复指南

针对Java开发中常见的“子类未实现抽象方法”编译错误,深入分析报错原因,提供重写实现、声明抽象子类两种标准修复路径,并总结参数签名、访问修饰符等典型避坑要点。

解决PHP递归报错:max_nesting_level限制与内存溢出处理
解决PHP递归报错:max_nesting_level限制与内存溢出处理

遇到PHP递归报错时,不要盲目调大max_nesting_level。本文教你区分Xdebug限制、内存耗尽和正则递归错误,提供代码级的终止条件优化与迭代替代方案,彻底解决栈溢出问题。

PHP递归中static变量与引用传递的常见陷阱及调试
PHP递归中static变量与引用传递的常见陷阱及调试

本文分析PHP递归中static变量导致的状态污染及引用传递引发的共享数据修改问题。提供具体的代码复现、缓存键设计建议及调试打印技巧,帮助开发者避免隐蔽的逻辑错误。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

WINDOWS 更多
3dmax(3ds max)
3dmax(3ds max)
Windows

Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。