付宇泽20190912-3 词频统计

本作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/6583

本作业代码https://e.coding.net/fyzs/ruangongcizhuitongji.git

一、重点/难点及相关代码:

  (1)实现每个功能首先要处理的就是文件数据处理问题,本作业使用python编码,使用open方法打开文件,read方法读取文件。

     代码:

  f = open(filename, 'r', -1, 'utf-8')
    text = f.read().lower()

  (2)需要进行特殊字符的替换以及进行单词分词才可以进行词频统计的操作。Python中使用正则表达式可以方便的替换所有特殊符号

   代码:

    p = re.compile('[-,$()#+&*.]')               #指定特殊字符
    text = re.sub(p, " ", str).split()           #字符替换

  (3)最基本的功能词频统计需要重复单词进行计数。Python中的数据字典也可以方便的实现这一功能。

 代码:

 dict = {}                                    #创建字典
    for str in text:                             #遍历文件内单词
        if str in dict.keys():                    
           dict[str] = dict[str] + 1
        else:
           dict[str] = 1
    word_list=sorted(dict.items(), key=lambda x: x[1], reverse=True)

  (4)由于题目要求所有功能编写在一个程序里,所以根据命令行的输入来判断相应执行的操作也是重点之一,判断的方法有很多,我选择根据命令行参数argc的长度来判断相应执行的操作。

  (5)功能二、功能三和功能四与功能一相比省去了文件后缀的输入,需要将文件名和后缀名相加作为新参数。

   代码:

file = argv[-1] + '.txt'

    (6)功能三需要输入文件名然后批量处理文件内的文本文件,这里可以使用os命令打开文件获取文件名称到列表。

 os.chdir(folder_name)
                filename_list = os.listdir()

    (7)功能四中用到了Linux重定向,'<'符号在linux重定向中的作用是标准输入,即在键盘键入文件名或者要统计的文本内容,由于之前没有了解过Linux重定向的内容,调试很多遍功能四依然没有能够实现。

二、功能代码及执行效果截图

  1.功能1代码:

    if len(argv) == 2:               
        try:
            list = file_read(argv[-1])
            opts, args = getopt.getopt(argv, "sh", ["ifile", "ofile"])
        except getopt.GetoptError:
            print("test.py -i <inputfile> -o <outputfile>")
            sys.exit(2)
        for opt, arg in opts:
            if opt == "-s":
                num = len(list)
                print('total',num)
                print('
')
                for word in list:
                    print('{:20s}{:>5d}'.format(word[0], word[1]))

  执行效果截图:

 

 2.功能2代码

 file = argv[-1] + '.txt'
        is_file = os.path.exists(file)
        if is_file:
            list = file_read(file)
            if len(list) <=10:
                print('total', len(list), 'words')
                for item in list:
                    print('{:20s}{:>5d}'.format(item[0], item[1]))
            else:                     
                print('total', len(list), 'words')
                print('
')
                for i in range(10):
                    print('{:20s}{:>5d}'.format(list[i][0], list[i][1]))

   执行效果截图:

3.功能3代码

        else:
            if argv[-1] != '-s':
                folder_name = argv[-1]
                os.chdir(folder_name)
                filename_list = os.listdir()
                for file_name in filename_list:
                    print(file_name[:-4])
                    file_list = [file_name[:-4]]
                    get_words(file_list)
                    print('----
')

执行效果截图

4.功能4代码

由于之前没有了解过Linux重定向的内容,调试很多遍功能四依然没有能够实现,之后会争取实现这个功能。

三、PSP

 

PSP阶段 预计花费时间(min) 实际花费时间(min) 分析原因
功能1 120 158 功能1功能并不复杂以及python语言的简便性,在实际编程中花费的时间大部分是在打包exe上和命令行参数的使用上,命令行参数真的需要学的透彻一些。
功能2 120 86 由于有前人对题目的需求分析以及功能2大部分是对功能1的复用,实际上需要解决的就是大文件的输入问题所以相比下少花了不少时间。
功能3 120 132 由于对前两个代码功能的整合不尽人意,在整合代码3的时候费了很大心思。
功能4 120 未实现 对Linux重定向理解经验不足,多次调试未能实现。
原文地址:https://www.cnblogs.com/Fuyuze/p/11537877.html