第二周作业03

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

代码详见[]

一、程序

此为该程序的main函数:

 

def main(argv):
    if (len(argv)==1):              #执行功能4的直接输入
        str0 = input()
        str0 = re.sub('[^a-zA-Z]',' ',str0)
        redirect(str0)
        
    elif (sys.argv[1]=='-s'):   
        
        if(len(argv)==2):           #执行功能4文件重定向

            str1 = input()
            str1 = re.sub('[^a-zA-Z]',' ',str1)
            redirect(str1)

        else:                       #执行功能1
              file_name1=argv[2]
              put_total(file_name1)
              put_1to10(file_name1)

    elif(str(os.path.exists(sys.argv[1]))=='True'): #执行功能3
        get_folder_filename(argv[1])

    else:                           #执行功能2
        file_name2=argv[1]+".txt"
        put_total_plush(file_name2)
        put_1to10(file_name2)
            
if __name__=="__main__":
    
    main(sys.argv)

 

 

功能一

  重点难点:1、命令行输入 2、只存取不重复字母且计数 在这里我用的python内置的Counter函数可以很好解决这个问题 3、在使用Counter之前要用正则表达式进行处理,将除字母以外都换成空格。

代码片段:

 

import sys
import os
import re
import fileinput
import codecs
#超级好用的自带计数器
from collections import Counter 

#以字符串形式获取文件中的内容
def get_txt(file_name):
    with codecs.open(file_name,'r',encoding='utf-8') as fo:
        str1 = fo.read()
        str1 = re.sub('[^a-zA-Z]',' ',str1)  #通过正则表达式 去除 除字母以外的字符
        return str1

#通过Counter返回个字典类型对象
def con(file_name):
    txt = get_txt(file_name)
    count = Counter(txt.split())
    return count

#按出现次数排序(通过调用内置的方法)
def put_1to10(file_name):
    
    
    dic=con(file_name).most_common(10)      #dic列表里面存的是元组
    for each in dic:
        print(each[0],each[1])
        

#返回不重复的单词个数(用于功能一)
def put_total(file_name):
    print("total:",len(con(file_name)))

 

 

功能一执行图:

第二周作业03

 

功能二

  重点难点:1、只读取文件名 需要自己加 .txt

代码片段:

#返回包括重复的单词个数
def put_total_plush(file_name):
    print("total:",len(list(con(file_name).elements())))

功能二执行图:

第二周作业03

 

功能三

重点难点:1、需要获取文件夹的路径 对路径要加以处理  2、用列表存取文件夹下的文本路径 

代码片段:

#用于文件夹功能
def get_folder_filename(folder_name):
    current_path = os.path.abspath('.')
    current_path = current_path.replace('\\','/') + '/'+ folder_name + '/'
    folder_list = []
    folder_path = os.listdir(current_path)

    for f in folder_path:
        folder_list.append(f)

    for i in folder_list:
        print(i)

    for j in folder_list:
        print(j)
        put_total_plush(current_path+j)
        put_1to10(current_path+j)

 

功能三执行图:

第二周作业03

 

功能四

重点难点:1、重定向传入 用input()接收 2、在main里作判断 如main中代码所示 3、到目前还未实现 将文件全部传入 用fileinput.input()获得对象 进行遍历到 可以实现 但在该代码中,这样做会影响 argv[]的不确定 无法实现main里的判断 个人能力有限经过查询也没找到合适方法。

代码片段:

#用于重定向
def redirect(str1):
    count = Counter(str1.split())
    print("total:",len(list(count.elements())))
    list1 = count.most_common(10)
    for each in list1:
        print(each[0],each[1])

执行效果图:

第二周作业03

第二周作业03

二、PSP

类别 预计花费时间(min) 实际花费时间(min) 分析差距原因
功能一 30 50min 刚开始对题目没有很好的理解,但经过反复试验后找到了很好的可行方式。
功能二 60 90min 在该功能中重新写了输出total的函数 在作业要求里反复查看发现, 除了功能一之外 total均要返回单词总数。
功能三 50 120min 在该功能中不了解获取当前目录以及以下的文件 相对知识欠缺是 费时的最大原因
功能四 60 180min 在该功能中实现通过命令行读取文件中的全部内容比较耗时 
测试/调试 100 180min 在各功能实现后发现细节错误很多,初期没有考虑全面。自己写的代码易读性较差,自己修改时 比较费劲。

三、总结

  经过该程序的锻炼学会了很多东西。学会了怎样通过查资料来解决没遇见过的问题, 本次训练也对以前的知识加以巩固,同时也让自己感到自己编程很菜、思路不清晰、代码自己看着都蒙。相信在通过大量练习之后会有所提高。最后 感觉写博客比编程序更难。

 

上一篇:Linux目录权限继承


下一篇:ABAP, Maven, CF App和Webpack的build