如何在Python中获取Word文档的字数?

3 投票
4 回答
6364 浏览
提问于 2025-04-17 02:55

我想统计一下 .doc、.docx、.odt 和 .pdf 文件中的单词数量。对于 .txt 文件,这个操作比较简单,但对于我提到的这些文件类型,我该怎么做呢?

我在 Ubuntu 系统上使用 Python 的 Django 框架,想要在用户通过系统上传文件时,统计这些文档中的单词数量。

4 个回答

0

既然你已经知道怎么处理.txt文件了,我就假设你会数单词,现在你只需要知道怎么读取不同类型的文件。可以看看这些库:

PDF文件: pypdf

doc/docx文件: 这个问题, python-docx

odt文件: 这里有例子

3

这些回答在处理MS Word和.odt文件时有些遗漏。

MS Word在每次保存.docx文件时都会记录字数。其实,.docx文件就是一个压缩文件。想要获取里面的“字数”属性其实很简单,可以用一些标准库里的模块来实现:

import zipfile
import xml.etree.ElementTree as ET

total_word_count = 0
for docx_file_path in docx_file_paths:
    zin = zipfile.ZipFile(docx_file_path)
    for item in zin.infolist():
        if item.filename == 'docProps/app.xml':
            buffer = zin.read(item.filename)
            root = ET.fromstring(buffer.decode('utf-8'))
            for child in root:
                if child.tag.endswith('Words'):
                    print(f'{docx_file_path} word count {child.text}')
                    total_word_count += int(child.text)
                    
print(f'total word count all files {total_word_count}')

优缺点:最大的优点是,对于大多数文件来说,这种方法会比其他方法快得多

主要的缺点是,你需要接受MS Word计算字数时的一些特殊规则:我对这些细节不是特别感兴趣,但我知道这些规则在不同版本中有所变化(比如,文本框里的字数可能会被算上,也可能不会)。

更重要的是,当你打开一个.docx文件时,Word保持的实时字数和Word在docProps/app.xml中保存的字数是有很大差别的。实际的字数通常比“字数”属性多大约10%,而这似乎和是否有页眉、页脚、文本框等没有关系。所以这可能适合你的需求,也可能不适合。通常来说,这种方法可以快速估算大量.docx文件的字数,但我建议加上额外的10%:可以称之为MJ(Microsoft-Junk)调整。

另外要注意,如果你选择逐字解析整个.docx文件的文本内容,可能也会遇到类似的误差。市面上有一些模块,比如python-docx,似乎做得还不错,但根据我的经验,没有一个是完美的。

如果你自己提取并解析.docx文件中的content.xml文件,你会发现其中有一些复杂的内容。

.odt文件
同样,这些也是压缩文件,meta.xml中也有类似的属性。我刚创建并解压了一个这样的文件,meta.xml的内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<office:document-meta xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:grddl="http://www.w3.org/2003/g/data-view#" office:version="1.3">
    <office:meta>
        <meta:creation-date>2023-06-11T18:25:09.898000000</meta:creation-date>
        <dc:date>2023-06-11T18:25:21.656000000</dc:date>
        <meta:editing-duration>PT11S</meta:editing-duration>
        <meta:editing-cycles>1</meta:editing-cycles>
        <meta:document-statistic meta:table-count="0" meta:image-count="0" meta:object-count="0" meta:page-count="1" meta:paragraph-count="1" meta:word-count="2" meta:character-count="12" meta:non-whitespace-character-count="11"/>
        <meta:generator>LibreOffice/7.4.6.2$Windows_X86_64 LibreOffice_project/5b1f5509c2decdade7fda905e3e1429a67acd63d</meta:generator>
    </office:meta>
</office:document-meta>

所以你需要查看root['office:meta']['meta:document-statistic'],属性meta:word-count

至于PDF文件,我不太清楚:它们可能需要强行计数。Pypdf2看起来是个不错的选择:最简单的方法是先转换成txt格式,然后再计数。我不太确定可能会遗漏什么。
例如,一个扫描的PDF可能有几百页,但却显示“0字”。或者,扫描的文本可能和真正的文本内容交错在一起……

4

首先,你需要读取你的 .doc 和 .docx 文件,还有 .odt 文件和 .pdf 文件。

其次,使用 计数 功能来统计单词的数量(<2.7 版本)。

撰写回答