WC 项目要求
wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。
实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。
具体功能要求:
程序处理用户需求的模式为:
wc.exe [parameter] [file_name]
下面是利用Python写出来的代码:
#!/usr/bin/env python
# -- coding: utf-8 --
# @Time : 2020-3-15 09:24
# @Author : Lintao
# @mail : 1595813308@qq.com
# @File : WC.exe.py
import os
import string
import re
'''
实现一个统计程序,
它能正确统计程序文件中的字符数、单词数、行数,
以及还具备其他扩展功能,
并能够快速地处理多个文件。
'''
def get_lines(file_path):
count = 0
f = open(file_path, 'r', encoding='utf-8')
for line in f.readlines():
count = count + 1
f.close()
return count
def get_chars(file_path):
f = open(file_path, 'r',encoding="UTF-8")
count = sum([len(word) for line in f for word in line.split()])
f.close()
return count
def get_words(file_path):
f = open(file_path,'r', encoding="UTF-8")
count = len(re.split(r'[^a-zA-Z]+', f.read())) - 1
f.close()
return count;
def get_other(file_path):
code_line = 0
none_line = 0
tip_line = 0
f = open(file_path, 'r', encoding='utf-8')
for line in f.readlines():
if not line.split():
none_line = none_line + 1
continue
elif (line[0:2] == '//'):
tip_line = tip_line + 1
continue
code_line = code_line + 1
f.close()
return [code_line, none_line, tip_line]
def get_help():
print("程序处理用户需求的模式为:wc.exe [parameter] [file_name]")
print("wc.exe -c file.c //返回文件 file.c 的字符数\nwc.exe -w file.c //返回文件 file.c 的词的数目\nwc.exe -l file.c //返回文件 file.c 的行数\n")
print("扩展功能:\n-s 递归处理目录下符合条件的文件。\n-a 返回更复杂的数据(代码行 / 空行 / 注释行)。\n")
if __name__ == '__main__':
Input = input("请输入命令(命令说明可以查找wc.exe -h):")
Ipt = Input.split()
if Ipt[0] == 'wc.exe':
if Ipt[1] == '-h':
get_help()
if len(Ipt) == 3:
if Ipt[1] == '-c':
count = get_chars(Ipt[-1])
print("代码行数为:", count)
elif Ipt[1] == '-w':
count = get_words(Ipt[-1])
print("代码单词为:", count)
elif Ipt[1] == '-l':
count = get_lines(Ipt[-1])
print("代码行数为:", count)
elif Ipt[1] == '-a':
tru = get_other(Ipt[-1])
print("代码行数为:", tru[0])
print("空行数为:", tru[1])
print("注释行数为:", tru[2])
else:
print("Error")
if len(Ipt) == 4:
files = os.listdir(Ipt[-1])
if Ipt[1] == '-s':
if Ipt[2] == '-c':
char_sums = 0;
for file in files:
if file[(len(file) - 2):len(file)] == ".c":
f = Ipt[-1] + '/' + file
char_sum = get_chars(f)
char_sums += char_sum
print("这个目录下的文件的字符数:",char_sums)
elif Ipt[2] == '-w':
word_sums = 0;
for file in files:
if file[(len(file) - 2):len(file)] == ".c":
f = Ipt[-1] + '/' + file
word_sum = get_words(f)
word_sums += word_sum
print("这个目录下的文件的单词数:" ,word_sums)
elif Ipt[2] == '-l':
line_sums = 0;
for file in files:
if file[(len(file) - 2):len(file)] == ".c":
f = Ipt[-1] + '/' + file
line_sum = get_lines(f)
line_sums += line_sum
print("这个目录下的文件的行数:",line_sums)
elif Ipt[2] == '-a':
other_sums = [0,0,0];
for file in files:
if file[(len(file) - 2):len(file)] == ".c":
f = Ipt[-1] + '/' + file
other_sum = get_other(f)
other_sums[0] += other_sum[0]
other_sums[1] += other_sum[1]
other_sums[2] += other_sum[2]
print("代码行数为:", other_sums[0])
print("空行数为:", other_sums[1])
print("注释行数为:", other_sums[2])
else:
print("Error")
if Ipt[2] == '-s':
if Ipt[1] == '-c':
char_sums = 0;
for file in files:
if file[(len(file) - 2):len(file)] == ".c":
f = Ipt[-1] + '/' + file
char_sum = get_chars(f)
char_sums += char_sum
print("这个目录下的文件的字符数:",char_sums)
elif Ipt[1] == '-w':
word_sums = 0;
for file in files:
if file[(len(file) - 2):len(file)] == ".c":
f = Ipt[-1] + '/' + file
word_sum = get_words(f)
word_sums += word_sum
print("这个目录下的文件的单词数:" ,word_sums)
elif Ipt[1] == '-l':
line_sums = 0;
for file in files:
if file[(len(file) - 2):len(file)] == ".c":
f = Ipt[-1] + '/' + file
line_sum = get_lines(f)
line_sums += line_sum
print("这个目录下的文件的行数:",line_sums)
elif Ipt[1] == '-a':
other_sums = [0,0,0];
for file in files:
if file[(len(file) - 2):len(file)] == ".c":
f = Ipt[-1] + '/' + file
other_sum = get_other(f)
other_sums[0] += other_sum[0]
other_sums[1] += other_sum[1]
other_sums[2] += other_sum[2]
print("代码行数为:", other_sums[0])
print("空行数为:", other_sums[1])
print("注释行数为:", other_sums[2])
else:
print("Error")
else:
print("Error")
input("Press any key to exit...")