此作业的要求参见[https://edu.cnblogs.com/campus/nenu/2019fall/homework/6583]
该作业采用的编程语言为Python,其代码的地址为[https://e.coding.net/sxl357/sxl.githttps://e.coding.net/sxl357/sxl.git]https://e.coding.net/sxl357/sxl.githttps://e.coding.net/sxl357/sxl.git
功能1 小文件输入
功能2 支持命令行输入英文作品的文件名
功能3 支持命令行输入存储有英文作品文件的目录名
功能4 从控制台读入英文单篇作品
1.功能1
重难点:
(1)如何输入命令行参数?
引入sys模块,使用sys.argv[]实现命令行参数的读取。
(2)如何打开文件?
引入os模块,利用open()函数打开文件,并返回文件对象,open()函数的基本形式为:open(file,mode),file为文件路径,mode为操作模式。
因为文件路径必须要有后缀.txt,所以先检查传入的文件路径有没有.txt,如果没有就加上。
因为py文件默认ASCII编码,中文在显示时会做一个ASCII到系统默认编码的转换,这时会报错,所以在open()函数里加‘encoding='utf-8’,意为以字节为单位对Unicode进行编码保存,这样遇到中文也不会出错。
(3)如何将文件中的所有单词整理在一个列表?
利用re模块的findall()函数,findall(pattern, string
)以列表的形式返回string中能与pattern匹配的子串,r'[a-z0-9^-]+',其中r是标识,[a-z0-9^-]+是正则表达式,表示一直匹配由小写字母、数字和非连字符‘-’组成的字符串,用read()函数读取文本内容,因为前面匹配时只提了小写字母,所以在用lower()函数将文本中所有的大写字母转为小写字母。
(4)如何统计各个单词出现的次数?
collections模块的Counter()函数用来跟踪值出现的次数,以字典的键值对形式存储,其中元素为key,其计数为value,返回一个字典
(5)如何统计总的单词个数(不重复)?
遍历Counter()函数生成的字典,设num初始值为1,每遍历一个键值对,num值加1
重要代码:
from collections import Counter import sys from re import findall def statistic(name): # 判断传入的命令行参数是否含有.txt,如果没有,要加上,再作为打开路径 d='.txt' if d in name: path=name else: path=name+d f=open(path,'r',encoding='utf-8') lists=findall(r'[a-z0-9^-]+',f.read().lower()) words=Counter(lists) #遍历字典,统计键值对数 num=0 for key,value in words.items(): num+=1
执行效果截图:
2.功能2
重难点:
(1)如何区分功能1和功能2?
用sys.argv[1]=='-s'来区分功能1和功能2,如果成立,就是功能1,如果不成立,并且传入的不是文件夹,就是功能2
(2)如何区分何时输出‘words’?
功能1和功能2都要调用statistic()函数,在函数里用sys.argv[1]=='s'判别是否输出‘words’。
(3)为什么不能用from sys import argv而要用import sys?
使用from sys import argv语句,则输入参数的数量必须与a,b,c,d……=argv中赋值的变量数量相同,否则会报错;
而import sys则不会,哪怕输入数量大于所读取的数量也无所谓,sys.argv[ ]只会按位读取。
(4)如何把出现次数最多的10个单词统计出来?
用most_common(n)函数返回计数值最大的n个元素的元素列表
重要代码:
#功能1不输出words,功能2输出words if sys.argv[1]=='-s': print('total'+' '+str(num)) else: print('total'+' '+str(num)+' words') maxwords=words.most_common(10) for i in maxwords: print('%-8s%5d'%(i[0],i[1])) #功能1 if sys.argv[1]=='-s': statistic(sys.argv[2]) #功能2 else: statistic(sys.argv[1])
执行效果截图:
3.功能3
重难点:
(1)如何处理文件和目录?
引入os模块,os.path.isdir()判断是否是文件夹,os.listdir()将文件夹中的文件列表化,列出目录下的所有文件(或许有更好的方法),os.path.isfile()用来判断是否是文件。
(2)如何同前两个功能区分?
在argv[1]=='-s'不成立情况下,用os.path.isdir(argv[1])判断传入的是文件还是文件夹,从而判断功能2还是功能3 ,成立就是功能3,否则就是功能2.
(3)如何只输出文件名而不输出后缀.txt?
os.path.splitext(file)[0]将文件名与后缀分开,将文件名显示出来
重要代码:
#传入文件夹 def liststatistic(path): files=os.listdir(path) for file in files: filename=os.path.splitext(file)[0] print(filename) statistic(file) print('----') #功能3 elif os.path.isdir(sys.argv[1]): liststatistic(sys.argv[1])
执行效果截图:
4.功能4
还未实现
5.psp
6.总结
完成过程
(1)无从下手
刚刚拿到作业时,整个人都是懵的,这对于我来说,无异于不会走时去跑,但总是要做下去的。首先是语言的选择,c,java还是Python,因为Java刚开始接触,也不会用C++做面向对象,Python里面模块比较多,可能更合适,所以选择了Python。那从哪下手呢?通过跟同学,师哥师姐交流,在啥都不会的情况下,模仿是最好的学习方法。
(2)模仿
因为往届的师哥师姐已经做过这个联系,他们的博客都能在博客园找到,我在里面读了几篇用Python写的,选择了一篇,找到代码,先运行出来,再研读,将代码打印出来,一句句研究,不会的就百度或和同学讨论,理解透了之后,开始一遍遍的敲,直至完完全全的自己能写出来,变成自己的。在运行时,将py文件转成exe文件花了大量的时间,附上一个有用的链接[http://blog.ijunyu.top/2018/09/20/py2exe/#more]
(3)改进
在已经理解透的基础上,我觉得代码还可以更简洁,有些功能还能用其他方法实现,开始改进,又出现了各种问题,再一个个的解决,出现了这个不是很完美的作品。
附加:关于Git客户端的那点事
1.Git将本地代码推到远程仓库的步骤:[https://blog.csdn.net/weixin_39910711/article/details/89955544]
2.远程仓库连接错误时,如何清除连接[https://www.cnblogs.com/wollow/p/10840016.html]
3.认证失败时,怎么办[https://www.jianshu.com/p/c095300d569e]
4.使用Git客户端下载代码的流程[https://blog.csdn.net/wyqwilliam/article/details/82881609]
5.Git clone和Git pull的简要区别[https://www.jianshu.com/p/c6a0397ec6f5]