You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python兼容doc/docx统计字符数 计算后导出排序去后缀xlsx

Word文档字符统计脚本改造实现

实现目标

  • 同时兼容.doc、.docx两种后缀的Word文档字符统计
  • 统计规则:单文件计算值 = 文件总字符数 / 65,最终结果导出为xlsx表格
  • 导出规则:文件名自动移除.doc/.docx后缀,按文件名中的数字序号自然排序,表格末尾统计所有文件计算值的总和

依赖安装

执行以下命令安装需要的第三方库:

pip install python-docx openpyxl pywin32

注:pywin32仅支持Windows环境,是读取旧版.doc格式兼容性最好的方案;如果是macOS/Linux环境,可以替换为textract库搭配系统antiword组件实现.doc读取。

完整可运行代码

import os
import re
import docx
import win32com.client as win32
from openpyxl import Workbook

def get_docx_char_count(file_path):
    """读取docx文件总字符数"""
    doc = docx.Document(file_path)
    return sum(len(p.text) for p in doc.paragraphs)

def get_doc_char_count(file_path):
    """读取doc文件总字符数(Windows环境)"""
    word = win32.gencache.EnsureDispatch('Word.Application')
    word.Visible = False
    doc = word.Documents.Open(os.path.abspath(file_path))
    char_count = 0
    for p in doc.Paragraphs:
        char_count += len(p.Range.Text)
    doc.Close()
    word.Quit()
    return char_count

def natural_sort_key(filename):
    """自然排序键,按文件名中的数字排序,避免字符串排序的序号错乱"""
    name_without_ext = os.path.splitext(filename)[0]
    return [int(part) if part.isdigit() else part.lower() for part in re.split(r'(\d+)', name_without_ext)]

if __name__ == '__main__':
    charCounts = {}
    # 遍历当前目录下所有文件
    for filename in os.listdir('.'):
        # 跳过Word生成的临时文件
        if filename.startswith('~$'):
            continue
        if filename.endswith('.docx'):
            count = get_docx_char_count(filename)
            pure_name = os.path.splitext(filename)[0]
            charCounts[pure_name] = count / 65
        elif filename.endswith('.doc'):
            count = get_doc_char_count(filename)
            pure_name = os.path.splitext(filename)[0]
            charCounts[pure_name] = count / 65

    # 按数字序号排序文件名
    sorted_names = sorted(charCounts.keys(), key=natural_sort_key)

    # 生成Excel
    wb = Workbook()
    ws = wb.active
    # 写入表头
    ws.cell(row=1, column=2, value='File Name')
    ws.cell(row=1, column=4, value='chars/65')
    # 逐行写入数据
    total = 0
    for idx, name in enumerate(sorted_names):
        row = idx + 3
        val = charCounts[name]
        total += val
        ws.cell(row=row, column=2, value=name)
        ws.cell(row=row, column=4, value=val)
    # 写入总和行
    total_row = len(sorted_names) + 3
    ws.cell(row=total_row, column=2, value='总计')
    ws.cell(row=total_row, column=4, value=total)
    # 保存结果文件
    wb.save('./charCounts.xlsx')

使用说明

  • 运行脚本前请关闭所有正在打开的Word文档,避免文件占用导致读取失败
  • 脚本默认统计自身所在目录下的所有Word文档,生成的charCounts.xlsx结果文件也会保存在同目录
  • 自然排序逻辑适配1.doc、2.docx、10_报告.doc这类带数字序号的文件名,不会出现字符串排序下10排在2前的错乱问题

内容的提问来源于stack exchange,提问作者Cyper-Python

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 08:24:21