此作業的要求參見[https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11206]
1、功能一
程序執行結果如下圖所示,
2、功能二
錄入A_BOYS_TRIP測試
錄入A_Year_With_A_Whaler測試
3、功能三
查看文件夾下的英文作品
輸入文件名進行測試
(補充截圖)
4、功能四
重定向輸入測試
5、代碼展示
該程序分為幾個功能不同的函數,分別實現特定的操作。是我感覺自己做的比較滿意的地方
1)、該函數根據輸入的文件或文件夾的名稱返回文件列表
'''isdir or isfile, return list'''
def filelist(filePath):
# get file list
if(os.path.isdir(filePath) == True):
# filePath is folder
return os.listdir(filePath)
elif(os.path.isfile(filePath) == True):
# filePath is file
return [filePath]
return
2)、該函數根據文件地址讀取文件內容,並使用正則表達式分割文件內容為詞匯列表。其中正則表達式是一大難點,也是一大亮點。
'''read file content'''
def opentxt(filePath):
with open(filePath, "r", encoding="utf-8") as file:
txtStr = file.read()
regEx = re.compile(u'\t|\n|\.|-|;|\)|\(|\?|"') # genernal
txtStr = re.sub(regEx, '', txtStr)
return txtStr.lower().split() # translate lower
3)、該函數傳入詞匯列表,統計詞匯出現次數並排序輸出
'''word frequency statistics and print sorted'''
def printsort(strList, isfile = True):
strDict = { } # storage word dict
for str in strList:
strDict[str] = strDict.get(str, 0) + 1
strDictSort = sorted(strDict.items(), key = lambda item : item[1], reverse = True)
print("total %d words \n" % len(strDictSort))
# format output
if(len(strDictSort) > 10):
for i in range(10):
print("{:5} {:5}".format(strDictSort[i][0], strDictSort[i][1]))
if(isfile == False):
print("----")
else:
for i in range(len(strDictSort)):
print("{:5} {:5}".format(strDictSort[i][0], strDictSort[i][1]))
if(isfile == False):
print("----")
return
4)、重定向執行函數,直接分割傳入的保存文本的變量,使用上述printsort()函數排序輸出
'''rediect word statistics'''
def redirect(strTxt):
regEx = re.compile(u'\t|\n|\.|-|;|\)|\(|\?|"') # genernal
txtStr = re.sub(regEx, '', strTxt).lower().split()
printsort(txtStr)
return
5)、詞頻統計函數,其中使用上述已介紹的函數,根據傳入參數為文件或是文件夾分別執行不同操作
'''word frequency statistics'''
def wordStatistics(filePath):
filePathList = filelist(filePath)
if(os.path.isfile(filePath)):
for file in filePathList:
printsort(opentxt(file))
else:
for file in filePathList:
print(file.split('.')[0])
printsort(opentxt(filePath + '\\' + file), False)
return
6)、主函數
if __name__ == '__main__':
parser = argparse.ArgumentParser()
# nargs - 命令行參數應當消耗的數目。
parser.add_argument("filePath", nargs = '?', help = "file or folder path") # filePath, file or folder
parser.add_argument('-s',nargs = '?', help = "file path")
args = parser.parse_args()
# wordStatistics(args.filePath)
if ((args.s == None) and (args.filePath == None)):
redi = sys.stdin.read() # redirect
redirect(redi)
pass
elif ((args.s == None) and (args.filePath != None)):
wordStatistics(args.filePath)
pass
elif ((args.s != None) and (args.filePath == None)):
wordStatistics(args.s)
pass
pass
6、PSP表
完成程序的四種功能的PSP表
完成該博客任務所用時間的PSP表
7、代碼及版本控制
GitHub中代碼地址https://github.com/1501106169/nenuWork.git
coding中代碼地址https://e.coding.net/nenuwork/nenuwork/nenuWork.git
8、功能五
修改源代碼中的輸出函數printsort(strList, isfile = True)為printsort(strList, top, leng, isfile=True)
def printsort(strList, top, leng, isfile=True):
strDict = { } # storage word dict
for str in strList:
strDict[str] = strDict.get(str, 0) + 1
strDictSort = sorted(strDict.items(), key = lambda item : item[1], reverse = True)
print("total %d words \n" % len(strDictSort))
# format output
for i in range(len(strDictSort)):
if(top <= 0): break
if(len(strDictSort[i][0]) == leng or leng == -1):
print("{:5} {:5}".format(strDictSort[i][0], strDictSort[i][1]))
top -= 1
if(isfile == False):
print("----")
return
主函數修改為
if __name__ == '__main__':
parser = argparse.ArgumentParser()
# nargs - 命令行參數應當消耗的數目。
parser.add_argument("filePath", nargs = '?', help = "file or folder path") # filePath, file or folder
parser.add_argument('-s',nargs = '?', help = "file path")
parser.add_argument('-l', nargs = '?', type = int, help = "word length", default = -1) # word length
parser.add_argument('-t', nargs = '?', type = int, help = "top number", default = 10) # top number
args = parser.parse_args()
# 輸出單詞長度5排名前十
# rewf test.txt -l 5 -t 10
# wordStatistics(args.filePath)
if ((args.s == None) and (args.filePath == None)):
redi = sys.stdin.read() # redirect
redirect(redi, top, leng)
pass
elif ((args.s == None) and (args.filePath != None)):
wordStatistics(args.filePath, args.t, args.l)
pass
elif ((args.s != None) and (args.filePath == None)):
wordStatistics(args.s, args.t, args.l)
pass
pass
命令行參數-l表示需要統計的單詞長度,默認全部;-t表示需要輸出的top單詞數,默認為10個
測試結果