宋晓丽20190912-3 词频统计

不想你离开。 提交于 2019-11-29 22:55:36

此作业的要求参见[https://edu.cnblogs.com/campus/nenu/2019fall/homework/6583]

该作业采用的编程语言为Python,其代码的GitHub地址为[https://github.com/simple357/statistic]

功能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)改进

在已经理解透的基础上,我觉得代码还可以更简洁,有些功能还能用其他方法实现,开始改进,又出现了各种问题,再一个个的解决,出现了这个不是很完美的作品。

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!