zoukankan      html  css  js  c++  java
  • 宋晓丽20190912-3 词频统计

    此作业的要求参见[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]

  • 相关阅读:
    解决Enterprise Library January 2006不能加密配置文件的方法
    ASP.NET Ajax 和ASP.NET 2.0 的登陆控件相冲突的问题的讨论
    十二时辰与时间对照表,十二经络时辰表
    对表中数据逐行累加
    SQL脚本 CASE...WHEN...THEN...ELSE...END 的应用
    [转]看刚毕业MM如何在北京买房
    让你的GUI程序随WINDOWS服务一起启动
    启动Oracle,SQL服务,IIS脚本
    无论买新房还是二手房 教你六招可放心收房
    经典开源项目简介及源码下载
  • 原文地址:https://www.cnblogs.com/simpleli66/p/11538293.html
Copyright © 2011-2022 走看看