前言
前天在公司接到一个需求,审合同时需要根据合同总字数来做一个字数挡位统计,让我用python来统计一下pdf和docx文件的字数
通过查阅资料结合大模型写了两个函数来统计字数
统计Docx字数
from docx import Document
import re
def get_word_count_like_ms_word(docx_path):
"""
获取与MS Word显示一致的字数统计(中文+标点)
"""
doc = Document(docx_path)
total_count = 0
for para in doc.paragraphs:
text = para.text
# 移除页脚页数(如·1·、- 1 -、第1页等)
text = re.sub(r'[·\-]\s*\d+\s*[·\-]|第\s*\d+\s*页','', text)
# 移除换行符、制表符等特殊空白字符
text = re.sub(r'[\s\t\n\r\u3000]', '', text)
# 统计剩余所有字符(中文+标点)
total_count += len(text)
return total_count
# 使用示例
count = get_word_count_like_ms_word("建筑工程廉政协议20230228171235.docx")
print(f"Word字数: {count}")
统计PDF字数
import pdfplumber
import re
def get_pdf_word_count_like_ms_word(pdf_path):
"""
获取与MS Word显示一致的PDF字数统计(中文+标点)
自动移除页脚页数(如·1·、·2·等格式)
"""
total_count = 0
with pdfplumber.open(pdf_path) as pdf:
for page in pdf.pages:
# 提取页面文本
text = page.extract_text()
if text:
# 移除页脚页数(如·1·、- 1 -、第1页等)
text = re.sub(r'[·\-]\s*\d+\s*[·\-]|第\s*\d+\s*页','', text)
# 移除所有空白字符
cleaned_text = re.sub(r'[\s\u3000]', '', text)
# 统计剩余字符
total_count += len(cleaned_text)
return total_count
# 使用示例
pdf_path = "建筑工程廉政协议20230228171235.pdf"
count = get_pdf_word_count_like_ms_word(pdf_path)
print(f"PDF字数: {count}")
待优化
最终统计出的字数要比WPS打开文件左下角显示的字数要多几个,因为英文单词算作一个字,英文字符和数字 以空格来分割算作一个字,并不是一个字符算作一个字。而汉字和中文字符都是一个算作一个字,所以使用python的len()方法统计的是字符的数量,所以统计出来的字数要多于Office所显示的字数。
但是因为合同都是中文,目前使用len()方法统计出的字数差异不大,所以目前先这样了,后面应该还会完善。
评论