如何在Python中获取Word文档的字数?
我想统计一下 .doc、.docx、.odt 和 .pdf 文件中的单词数量。对于 .txt 文件,这个操作比较简单,但对于我提到的这些文件类型,我该怎么做呢?
我在 Ubuntu 系统上使用 Python 的 Django 框架,想要在用户通过系统上传文件时,统计这些文档中的单词数量。
4 个回答
既然你已经知道怎么处理.txt文件了,我就假设你会数单词,现在你只需要知道怎么读取不同类型的文件。可以看看这些库:
PDF文件: pypdf
doc/docx文件: 这个问题, python-docx
odt文件: 这里有例子
这些回答在处理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字”。或者,扫描的文本可能和真正的文本内容交错在一起……
首先,你需要读取你的 .doc 和 .docx 文件,还有 .odt 文件和 .pdf 文件。