Python 小程序编写系列(第二部):打造实用的文本字数统计工具

在上一部中,我们通过猜数字游戏掌握了 Python 基础语法、循环与条件判断等核心技能。本次我们将转向更贴近实际需求的场景,开发一个文本字数统计工具。这个工具不仅能统计文本中的字符数、单词数,还能分析段落数与标点符号数量,帮助大家在写作、编辑时快速掌握文本规模。通过本次开发,我们将重点学习 Python 的文件读写操作、字符串高级处理以及批量处理文件的方法。

一、工具核心功能定位

在正式编码前,我们先明确文本字数统计工具需要实现的核心功能,确保工具兼具实用性与易用性:

  1. 支持多种输入方式:既能直接输入文本内容进行统计,也能读取本地 TXT、DOCX(基础版支持 TXT,进阶版拓展 DOCX)文件进行分析。
  1. 多维度统计指标:至少包含字符数(含 / 不含空格)、单词数(中文按词语分割,英文按空格分割)、段落数、标点符号数。
  1. 友好的结果展示:以清晰的格式输出统计结果,让用户一目了然。
  1. 错误处理机制:当读取文件不存在、格式不支持或权限不足时,给出明确的错误提示,避免程序崩溃。
  1. 批量处理拓展:基础功能实现后,增加批量处理文件夹内所有文本文件的能力。

二、前置知识储备

本次开发需要用到以下 Python 知识点,提前了解有助于更好地理解代码逻辑:

  1. 文件操作:使用open()函数实现文件的读取,掌握r(只读)模式的使用,以及with语句对文件资源的自动管理。
  1. 字符串处理:运用strip()、split()、count()等方法处理文本,结合正则表达式(re模块)匹配标点符号与中文词语。
  1. 条件分支与循环:通过分支判断用户输入的操作类型(直接输入文本 / 读取文件),使用循环实现批量文件处理。
  1. 第三方库(可选):若需支持 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),相对路径需确保文件在程序运行目录下。

五、功能拓展思路

完成基础版本后,可进一步拓展工具能力,提升实用性:

  1. 导出统计结果:将统计结果保存为 Excel 或 CSV 文件,方便后续分析(需安装pandas库)。
  1. 中文分词优化:使用jieba库替代简单的中文字符分割,实现更精准的中文词语统计(pip install jieba)。
  1. 支持更多格式:拓展对 PDF(PyPDF2库)、MD(Markdown)文件的支持。
  1. 图形化界面:使用tkinter或PyQt开发图形界面,让非技术用户也能轻松使用。

六、小结

通过本次文本字数统计工具的开发,我们系统掌握了 Python 文件读写(open()、with语句)、字符串处理(正则表达式、字符串方法)、文件夹操作(os模块)以及第三方库的使用。这些技能在处理日志分析、数据清洗、文档批量处理等场景中都有广泛应用。

下一部,我们将开发一个天气预报查询工具,学习如何调用 API 接口获取网络数据,以及 JSON 格式数据的解析。大家可以尝试基于本次代码,实现 “导出统计结果到 Excel” 的功能,提前熟悉第三方库的使用,我们下期再见!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐