陈志侠第二次作业
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/zjlg/rjjc |
---|---|
这个作业的目标 | 编写实现命令行计数统计文本程序 |
姓名-学号 | 陈志侠 2022329301009 |
码云地址 | https://gitee.com/chen-zhixia666/second-assignment |
一、项目简介及其相关的用法
1.1项目简介
本项目旨在利用PyCharm实现一个命令行文本计数统计程序,能正确统计导入的纯英文txt文本中的字符数,单词数,句子数。在拓展功能中,实现了统计代码行、空行、注释行、标点符号数、特定单词数等功能,用户可以通过命令行参数选择不同的统计功能,并指定要处理的文本文件。
1.2相关用法
具体命令行界面要求举例:
命令模式: wc.exe [参数] [文件名]
- wc.exe -c file.txt 统计字符数
- wc.exe -w file.txt 统计单词数
扩展功能(加分项):统计代码行、空行、注释行等,并提供相应命令接口。
二、文件列表及其相关说明
2.1文件列表
不同版本号体现各个版本更迭
v0.1 | 空项目 |
---|---|
v0.2 | 项目完成基础功能 |
v0.3 | 项目完成扩展功能(加分项) |
点击查看v0.2代码
import sys
import re
def count_characters(text):
return len(text) #字符数
def count_words(text):
words = text.split()
return len(words) #单词数,以空格分割
def count_sentences(text):
sentences = re.split(r'[.!?]', text)
return len([s for s in sentences if s]) #句子数,以‘.’、‘!’、‘?’作为句子结束标志
def main():
if len(sys.argv) != 3: #检查命令行参数的数量是否正确
print("笨蛋,正确用法是: python v0.2.py -c或-w或-s txt文件名")
print("不同选择的意思是: -c (字符数), -w (单词数), -s (句子数)")
sys.exit(1)
option = sys.argv[1]
filename = sys.argv[2]
try:
with open(filename, 'r') as file:
text = file.read()
except FileNotFoundError: #如果文件不存在
print(f"错误!!!!!这个文件居然不存在!!!")
sys.exit(1)
if option == "-c":
num_characters = count_characters(text)
print(f"字符数: {num_characters}")
elif option == "-w":
num_words = count_words(text)
print(f"单词数: {num_words}")
elif option == "-s":
num_sentences = count_sentences(text)
print(f"句子数: {num_sentences}")
else:
print("你的选择出错了,请使用-c或-w或-s")
sys.exit(1)
if __name__ == "__main__":
main()
点击查看v0.3代码
import sys
import re
def count_characters(text):
return len(text) #字符数
def count_words(text):
words = text.split()
return len(words) #单词数,以空格分割
def count_sentences(text):
sentences = re.split(r'[.!?]', text)
return len([s for s in sentences if s]) #句子数,以‘.’、‘!’、‘?’作为句子结束标志
def count_lines(text):
return len(text.split('\n')) #代码行数,用换行符进行分割
def count_empty_lines(text):
return len([line for line in text.split('\n') if not line.strip()]) #空行数,过滤掉非空行
def count_comment_lines(text):
return len([line for line in text.split('\n') if line.strip().startswith('#')]) #注释行数,以‘#’开头
def count_punctuation(text):
punctuation = re.findall(r'[.,;:?!-]', text)
return len(punctuation) #标点符号数
def count_specific_word(text, word):
words = re.findall(r'\b{}\b'.format(re.escape(word)), text)
return len(words) #特定单词数
def main():
if len(sys.argv) < 3 or len(sys.argv) > 4: #检查命令行参数的数量是否正确
print("笨蛋,正确用法是: python v0.3.py -c或-w或-s或-e或-m或-a或-p txt文件名")
print("不同选择的意思是: -c (字符数), -w (单词数), -s (句子数),-e(代码行数),-m(空行数),-a(注释行数),-p(标点符号数)")
print("当你想要统计特定单词的出现数时,用法是:python v0.3.py -x txt文件名 [特定单词]")
sys.exit(1)
option = sys.argv[1]
filename = sys.argv[2]
specific_word = sys.argv[3] if len(sys.argv) == 4 else None #获得特定单词(如果有)
try:
with open(filename, 'r') as file:
text = file.read()
except FileNotFoundError: #如果文件不存在
print(f"错误!!!!!这个文件居然不存在!!!")
sys.exit(1)
if option == "-c":
num_characters = count_characters(text)
print(f"字符数: {num_characters}")
elif option == "-w":
num_words = count_words(text)
print(f"单词数: {num_words}")
elif option == "-s":
num_sentences = count_sentences(text)
print(f"句子数: {num_sentences}")
elif option == "-e":
num_lines = count_lines(text)
print(f"代码行数: {num_lines}")
elif option == "-m":
num_empty_lines = count_empty_lines(text)
print(f"空行数: {num_empty_lines}")
elif option == "-a":
num_comment_lines = count_comment_lines(text)
print(f"注释行数: {num_comment_lines}")
elif option == "-p":
num_punctuation = count_punctuation(text)
print(f"标点符号数: {num_punctuation}")
elif option == "-x":
if specific_word is None:
print("拜托,告诉我你想统计什么单词好吗")
sys.exit(1)
num_specific_word = count_specific_word(text, specific_word)
print(f"'{specific_word}' 出现的次数: {num_specific_word}")
else:
print("你的选择出错了,请使用-c或-w或-s或-e或-m或-a或-p或-x")
sys.exit(1)
if __name__ == "__main__":
main()
2.2程序说明
2.2.1函数说明
(1) count_characters(text):
- 功能: 计算并返回文本中的字符数。
- 参数:
text
(str): 输入的文本字符串。 - 返回值: 整数,表示字符数。
(2) count_specific_word(text, word):
- 功能: 计算并返回文本中特定单词的出现次数。单词匹配是区分大小写的,并且要求整个单词匹配(即不是部分匹配)。
- 参数:
text
(str): 输入的文本字符串。word
(str): 要统计的特定单词。
- 返回值: 整数,表示特定单词出现的次数。
其他count函数功能类似,在此不一一阐述。
(3)main():
- 功能: 主函数,处理命令行参数(-c、-w、-s、-e等)并调用相应的统计函数。
- 参数: 无直接参数,但通过命令行传递。
- 返回值: 无直接返回值,但会打印统计结果或错误信息。
2.2.2参数说明
-c
: 统计字符数。-w
: 统计单词数。-s
: 统计句子数。-e
: 统计代码行数。-m
: 统计空行数。-a
: 统计注释行数。-p
: 统计标点符号数。-x
: 统计特定单词的出现次数。
三、例程运行及其相关结果
3.1.例程准备
在运行前准备好纯英文txt文件,使其满足具有字符、句子、注释行的要求。
3.2例程运行流程
-
检查命令行参数:
- 程序首先检查命令行参数的数量是否正确(3个或4个)。
- 如果参数数量不正确,会打印错误信息并退出。
-
读取文件内容:
- 根据用户提供的文件名,尝试打开并读取文件内容。
- 如果文件不存在,会打印错误信息并退出。
-
根据选项执行相应的统计函数:
- 根据用户选择的选项(如
-c
、-w
、-s
等),调用相应的统计函数。 - 每个统计函数都会处理文件内容并返回结果。
- 根据用户选择的选项(如
-
输出结果:
- 将统计结果打印到控制台。
3.3运行结果
3.3.1 v0.2.py运行结果
3.3.2 v0.3.py运行结果
四、总结
4.1 收获
- 掌握了字符串处理方法和正则表达式的应用。
- 学会了如何处理命令行参数。
- 提升了代码的组织和调试能力。
4.2 改进空间
- 可以增加更多的统计功能,如统计不同类型单词的数量等。
- 可以优化性能,特别是对于大文件的处理。
- 可以添加更多的错误处理机制,以提高程序的健壮性。
通过本次实验,让我对python这个软件更加深入了解了,并且在其中收获快乐,这是一次非常棒的体验:)