《Python 小程序编写系列》(第二部):打造实用的文本字数统计工具
Python 小程序编写系列(第二部):打造实用的文本字数统计工具
在上一部中,我们通过猜数字游戏掌握了 Python 基础语法、循环与条件判断等核心技能。本次我们将转向更贴近实际需求的场景,开发一个文本字数统计工具。这个工具不仅能统计文本中的字符数、单词数,还能分析段落数与标点符号数量,帮助大家在写作、编辑时快速掌握文本规模。通过本次开发,我们将重点学习 Python 的文件读写操作、字符串高级处理以及批量处理文件的方法。
一、工具核心功能定位
在正式编码前,我们先明确文本字数统计工具需要实现的核心功能,确保工具兼具实用性与易用性:
- 支持多种输入方式:既能直接输入文本内容进行统计,也能读取本地 TXT、DOCX(基础版支持 TXT,进阶版拓展 DOCX)文件进行分析。
- 多维度统计指标:至少包含字符数(含 / 不含空格)、单词数(中文按词语分割,英文按空格分割)、段落数、标点符号数。
- 友好的结果展示:以清晰的格式输出统计结果,让用户一目了然。
- 错误处理机制:当读取文件不存在、格式不支持或权限不足时,给出明确的错误提示,避免程序崩溃。
- 批量处理拓展:基础功能实现后,增加批量处理文件夹内所有文本文件的能力。
二、前置知识储备
本次开发需要用到以下 Python 知识点,提前了解有助于更好地理解代码逻辑:
- 文件操作:使用open()函数实现文件的读取,掌握r(只读)模式的使用,以及with语句对文件资源的自动管理。
- 字符串处理:运用strip()、split()、count()等方法处理文本,结合正则表达式(re模块)匹配标点符号与中文词语。
- 条件分支与循环:通过分支判断用户输入的操作类型(直接输入文本 / 读取文件),使用循环实现批量文件处理。
- 第三方库(可选):若需支持 DOCX 文件,需安装python-docx库,通过pip install python-docx命令安装。
三、分步实现工具功能
我们将分阶段实现工具功能,先完成基础的文本输入与单文件统计,再拓展批量处理能力。
(一)基础版:文本输入与单文件统计
1. 导入必要模块
基础版需导入re模块用于正则匹配,若后续拓展 DOCX 支持,再导入docx模块。
# 导入正则表达式模块,用于匹配标点符号等
import re
2. 定义统计核心函数
编写count_text_stats()函数,接收文本内容作为参数,返回多维度统计结果。
def count_text_stats(text):
"""
统计文本的多维度指标
:param text: 待统计的文本内容(字符串)
:return: 包含统计结果的字典
"""
# 1. 统计字符数(含空格)
total_chars_with_space = len(text)
# 统计字符数(不含空格):替换所有空格后计算长度
total_chars_without_space = len(text.replace(" ", ""))
# 2. 统计单词数/词语数
# 中文按词语分割(简单版:按字符分割,实际可结合jieba库优化)
# 英文按空格分割,先去除首尾空格,再按空格拆分,过滤空字符串
chinese_chars = re.findall(r'[\u4e00-\u9fa5]', text) # 匹配所有中文字符
english_words = [word for word in text.strip().split() if word] # 拆分英文单词
total_words = len(chinese_chars) + len(english_words) # 总词语数(中文按字符计,进阶可优化)
# 3. 统计段落数:按空行分割,过滤空段落
paragraphs = [para for para in text.split('\n') if para.strip()]
total_paragraphs = len(paragraphs)
# 4. 统计标点符号数:匹配常见标点符号
punctuation = re.findall(r'[,。!?;:""''()【】《》,./<>?;:"\'()\[\]{}!@#$%^&*~`-=_+]', text)
total_punctuation = len(punctuation)
# 返回统计结果字典
return {
"总字符数(含空格)": total_chars_with_space,
"总字符数(不含空格)": total_chars_without_space,
"总词语数": total_words,
"总段落数": total_paragraphs,
"总标点符号数": total_punctuation
}
3. 实现用户交互与文件读取
编写主逻辑,支持用户选择 “直接输入文本” 或 “读取本地 TXT 文件”,并调用统计函数输出结果。
def main():
print("=" * 50)
print(" Python 文本字数统计工具 ")
print("=" * 50)
# 让用户选择操作类型
choice = input("请选择操作类型(1-直接输入文本,2-读取本地TXT文件):")
if choice == "1":
# 直接输入文本
print("\n请输入需要统计的文本(输入完成后按Ctrl+D或Ctrl+Z结束输入,Windows用户可按Enter后输入空行):")
text = ""
while True:
try:
line = input()
text += line + "\n"
except EOFError:
break
# 去除末尾多余的换行符
text = text.rstrip("\n")
elif choice == "2":
# 读取本地TXT文件
file_path = input("\n请输入TXT文件路径(例如:C:/test.txt 或 ./test.txt):")
try:
# 使用with语句自动管理文件资源,避免遗漏关闭
with open(file_path, "r", encoding="utf-8") as f:
text = f.read()
except FileNotFoundError:
print(f"错误:文件 '{file_path}' 不存在,请检查路径是否正确!")
return
except PermissionError:
print(f"错误:没有读取文件 '{file_path}' 的权限!")
return
except UnicodeDecodeError:
print(f"错误:文件编码不是UTF-8,请尝试其他编码(如GBK)!")
# 尝试用GBK编码读取(兼容部分中文文件)
try:
with open(file_path, "r", encoding="gbk") as f:
text = f.read()
except:
print("错误:无法识别文件编码,统计失败!")
return
except Exception as e:
print(f"读取文件时发生未知错误:{str(e)}")
return
else:
print("错误:无效的选择,请输入1或2!")
return
# 调用统计函数获取结果
stats = count_text_stats(text)
# 展示统计结果
print("\n" + "=" * 50)
print(" 统计结果 ")
print("=" * 50)
for key, value in stats.items():
print(f"{key}:{value}")
print("=" * 50)
# 启动程序
if __name__ == "__main__":
main()
(二)进阶版:拓展批量处理与 DOCX 支持
1. 批量处理文件夹内所有 TXT 文件
增加batch_count_files()函数,遍历指定文件夹内的所有 TXT 文件,批量生成统计结果。
import os # 导入os模块用于文件夹操作
def batch_count_files(folder_path):
"""
批量统计文件夹内所有TXT文件的字数
:param folder_path: 文件夹路径
"""
# 检查文件夹是否存在
if not os.path.exists(folder_path):
print(f"错误:文件夹 '{folder_path}' 不存在!")
return
if not os.path.isdir(folder_path):
print(f"错误:'{folder_path}' 不是一个有效的文件夹!")
return
# 遍历文件夹内的所有文件
txt_files = [f for f in os.listdir(folder_path) if f.endswith(".txt")]
if not txt_files:
print(f"提示:文件夹 '{folder_path}' 内没有找到TXT文件!")
return
print(f"\n找到 {len(txt_files)} 个TXT文件,开始批量统计...")
print("=" * 80)
# 逐个文件统计
for file_name in txt_files:
file_path = os.path.join(folder_path, file_name)
print(f"\n【文件:{file_name}】")
try:
with open(file_path, "r", encoding="utf-8") as f:
text = f.read()
stats = count_text_stats(text)
for key, value in stats.items():
print(f" {key}:{value}")
except Exception as e:
print(f" 统计失败:{str(e)}")
print("=" * 80)
print("批量统计完成!")
# 在main函数中增加批量处理的选择
def main():
# (保留之前的代码)
print("=" * 50)
print(" Python 文本字数统计工具 ")
print("=" * 50)
choice = input("请选择操作类型(1-直接输入文本,2-读取本地TXT文件,3-批量统计文件夹TXT文件):")
# (保留1、2选项的代码)
elif choice == "3":
folder_path = input("\n请输入文件夹路径(例如:C:/text_files 或 ./text_files):")
batch_count_files(folder_path)
# (保留后续代码)
2. 支持 DOCX 文件读取(需安装 python-docx)
若需统计 Word 文档(DOCX),需安装python-docx库,并增加read_docx()函数读取 DOCX 内容。
# 尝试导入python-docx库,若未安装则提示
try:
from docx import Document
except ImportError:
print("提示:未安装python-docx库,无法支持DOCX文件。可通过 'pip install python-docx' 安装。")
Document = None
def read_docx(file_path):
"""
读取DOCX文件内容
:param file_path: DOCX文件路径
:return: 文档内容字符串
"""
if not Document:
raise ImportError("python-docx库未安装,无法读取DOCX文件!")
doc = Document(file_path)
text = "\n".join([para.text for para in doc.paragraphs])
return text
# 在main函数的文件读取部分增加DOCX支持
elif choice == "2":
file_path = input("\n请输入文件路径(支持TXT/DOCX,例如:C:/test.txt 或 ./test.docx):")
try:
if file_path.endswith(".txt"):
# (保留TXT读取代码)
elif file_path.endswith(".docx"):
if not Document:
print("错误:需安装python-docx库才能读取DOCX文件,执行 'pip install python-docx' 后重试!")
return
text = read_docx(file_path)
else:
print("错误:仅支持TXT和DOCX格式文件!")
return
# (保留后续错误处理代码)
四、工具测试与使用说明
1. 测试方法
- 直接输入文本:运行程序后选择 “1”,输入一段文本(如 “Python 是一门简洁易用的编程语言。”),查看统计结果是否正确。
- 读取 TXT 文件:准备一个 TXT 文件,输入文件路径(相对路径如./test.txt,绝对路径如C:/Users/XXX/Desktop/test.txt),验证统计结果。
- 批量处理:创建一个文件夹,放入多个 TXT 文件,选择 “3” 输入文件夹路径,检查批量统计是否正常。
2. 常见问题解决
- 编码错误:若 TXT 文件提示 “UnicodeDecodeError”,可尝试在open()函数中修改encoding参数为 “gbk” 或 “gb2312”(部分中文文件使用该编码)。
- DOCX 读取失败:确保已安装python-docx库,且 DOCX 文件未被其他程序占用。
- 路径错误:Windows 系统路径需使用 “/” 或 “\”(如C:\\test.txt),相对路径需确保文件在程序运行目录下。
五、功能拓展思路
完成基础版本后,可进一步拓展工具能力,提升实用性:
- 导出统计结果:将统计结果保存为 Excel 或 CSV 文件,方便后续分析(需安装pandas库)。
- 中文分词优化:使用jieba库替代简单的中文字符分割,实现更精准的中文词语统计(pip install jieba)。
- 支持更多格式:拓展对 PDF(PyPDF2库)、MD(Markdown)文件的支持。
- 图形化界面:使用tkinter或PyQt开发图形界面,让非技术用户也能轻松使用。
六、小结
通过本次文本字数统计工具的开发,我们系统掌握了 Python 文件读写(open()、with语句)、字符串处理(正则表达式、字符串方法)、文件夹操作(os模块)以及第三方库的使用。这些技能在处理日志分析、数据清洗、文档批量处理等场景中都有广泛应用。
下一部,我们将开发一个天气预报查询工具,学习如何调用 API 接口获取网络数据,以及 JSON 格式数据的解析。大家可以尝试基于本次代码,实现 “导出统计结果到 Excel” 的功能,提前熟悉第三方库的使用,我们下期再见!
更多推荐



所有评论(0)