운영 요구 사항을 참조하십시오 https://edu.cnblogs.com/campus/nenu/2019fall/homework/6583
[코드를 참조하십시오
첫째, 프로그램
이 프로그램의 주요 기능입니다 :
DEF (argv와) 주 :
IF (LEN (argv와) == 1.) : #가 직접 입력 (4)의 기능을 수행
Str0 = 입력 ()
Str0 =의 re.sub ( ' [^ A-ZA-는 Z] ' , ' ' , Str0 )
리디렉션 (Str0)
ELIF 합니다 (sys.argv에의 == 1.] ' -s ' ) :
IF (LEN (argv와) == 2) : #이 파일 경로 (4)의 기능을 수행
STR1 = INPUT ()
STR1 =의 re.sub를 ( ' [^ A-ZA-는 Z] ' , ' ' , STR1)
리디렉션 (STR1)
다른 : #이 기능을 수행 하나.
file_name1 = argv와 [2 ]
put_total (file_name1)
put_1to10 (file_name1)
ELIF (STR (os.path.exists합니다 (sys.argv에의)) == 1.] ' 참 ' ) : #의 . 집행 기능 3
get_folder_filename을 (argv와의 [1. ])
다른 : #이 기능을 수행 2
file_name2 = argv와의 + [1.] " 가 .txt "
put_total_plush (file_name2)
put_1to10 (file_name2)
IF __name__ == " __main__ " :
주 (sys.argv에)
함수
키 어려운 : 1, 2 커맨드 라인 입력, 전용 액세스 글자를 반복하고 여기에 계산되지 파이썬 내장 카운터 기능 내가 사용하기 전에 카운터가뿐만 아니라, 처리를 위해 정규 표현식을 사용하여이 문제 3에 대한 좋은 해결책이 될 수 사용 문자 이외의 공백으로 대체됩니다.
니펫
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)))
功能一执行图:
功能二
重点难点:1、只读取文件名 需要自己加 .txt
代码片段:
#返回包括重复的单词个数
def put_total_plush(file_name):
print("total:",len(list(con(file_name).elements())))
功能二执行图:
功能三
重点难点: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)
功能三执行图:
功能四
重点难点: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])
执行效果图:
二、PSP
类别 | 预计花费时间(min) | 实际花费时间(min) | 分析差距原因 |
功能一 | 30 | 50min | 刚开始对题目没有很好的理解,但经过反复试验后找到了很好的可行方式。 |
功能二 | 60 | 90min | 在该功能中重新写了输出total的函数 在作业要求里反复查看发现, 除了功能一之外 total均要返回单词总数。 |
功能三 | 50 | 120min | 在该功能中不了解获取当前目录以及以下的文件 相对知识欠缺是 费时的最大原因 |
功能四 | 60 | 180min | 在该功能中实现通过命令行读取文件中的全部内容比较耗时 |
测试/调试 | 100 | 180min | 在各功能实现后发现细节错误很多,初期没有考虑全面。自己写的代码易读性较差,自己修改时 比较费劲。 |
三、总结
经过该程序的锻炼学会了很多东西。学会了怎样通过查资料来解决没遇见过的问题, 本次训练也对以前的知识加以巩固,同时也让自己感到自己编程很菜、思路不清晰、代码自己看着都蒙。相信在通过大量练习之后会有所提高。最后 感觉写博客比编程序更难。