這個作業屬於哪個課程 | https://edu.cnblogs.com/campus/fzu/SE2020 |
---|---|
這個作業要求在哪里 | https://edu.cnblogs.com/campus/fzu/SE2020/homework/11167 |
這個作業的目標 | 學習解析 Json 文件,以及熟悉 GitHub 的使用 |
學號 | 031802539 |
目錄
PSP 表格
PSP2.1 | Personal Software Process Stages | 預估耗時(分鍾) | 實際耗時(分鍾) |
---|---|---|---|
Planning | 計划 | ||
Estimate | 估計這個任務需要多少時間 | ||
Development | 開發 | ||
Analysis | 需求分析 (包括學習新技術) | 60 | 120 |
Design Spec | 生成設計文檔 | 10 | 10 |
Design Review | 設計復審 | 20 | 30 |
Coding Standard | 代碼規范 (為目前的開發制定合適的規范) | 10 | 10 |
Design | 具體設計 | 10 | 10 |
Coding | 具體編碼 | 120 | 200 |
Code Review | 代碼復審 | 20 | 120 |
Test | 測試(自我測試,修改代碼,提交修改) | 10 | 10 |
Reporting | 報告 | 20 | 20 |
Test Report | 測試報告 | ||
Size Measurement | 計算工作量 | ||
Postmortem & Process Improvement Plan | 事后總結, 並提出過程改進計划 | ||
合計 | 280 | 530 |
解題過程
- 分析需求:解析 Json 文件,統計用戶或項目發生的某種事件的數量
- 編碼分析:查找資料,了解 Python 如何解析 Json 文件,以及如何實現命令行參數
- 測試結果:利用老師發的腳本進行本地測試
- 提交到 GitHub 運行測試
代碼組織思維導圖
代碼說明
初始化
def read_json(path):
filelist = os.listdir(path)#讀取文件列表
f2=open('data.json','w',encoding=> 'utf-8')
for file in filelist:#讀json文件
pathname=path+'\\'+file
with open(pathname,encoding='utf-8') as f:
for line in f:
f2.write(line)#寫入data.json
return
命令行參數設置
opt,arv= getopt.getopt(sys.argv[1:],'i:u:r:e:',['user=','repo=','event=','init='])
遍歷計算結果
def caculate_ans(data,username,repo,event):
ans=0
for da in data:
if not len(username)==0:#判斷有無username
if not username==da['actor']['login']:
continue
else:
pass
else:
pass
if not len(repo)==0:#判斷有無repo
if not repo==da['repo']['name']:
continue
else:
pass
else:
pass
#判斷項目
if da['type']==event:
ans=ans+1
else:
pass
return ans
單元測試截圖
本地測試程序
示例程序執行結果
我的程序執行結果
GitHub 運行測試結果
單元測試覆蓋率及性能測試
單元測試覆蓋率
測試過程
測試結果
利用 coverage 工具統計單元測試覆蓋率,用給出的測試腳本進行測試,可以看到覆蓋率有92%。
性能測試
性能優化
- 想用多線程優化代碼,這部分還在碼中...
- 用正則解析代替 Python 自帶的 Json 庫優化代碼性能。
- 優化計划:
1、把初始化的文件分開儲存,在后續計算結果的時候利用多線程優化。
2、用正則解析 Json。
代碼規范鏈接
迭代過程
1、學習單一的 Json 解析
2、學習命令行參數
3、兩個功能融合,以及調試代碼
4、測試有無 Bug
5、改進代碼保證結果正確
6、代碼格式整理
困難及辦法
(一)
- 花了一下午時間才弄懂解析 Json 文件,用 Python 的 Json 解析語句一直報錯。
- 看了一些博客發現博客里用來示例的 Json 和給出的文件里的不一樣,文件里的應該逐行解析。
(二)
- 命令行參數不太懂,原來只會用 sys 模塊。
- 網絡檢索,發現還有支持短選項和長選項的 getopt 模塊。
(三)
- 不懂如何初始化后 data 參數保持不變。
- 看了老師的實例發現是將解析好的 Json 重新寫入一個文件中,在查詢的時候再進行對新建文件的解析。
(四)
- Python 的單元測試覆蓋率要計算工具 coverage 進行統計。
- Python 的性能測試也用 cProfile 解決。
(五)
- 利用對 Python 進行優化有點困難,以前只用過 Java 的多線程,而且好像 Python 的優化效果也不是很好。
(六)
- 使用 Git 控制版本的問題用 PyCharm 解決。
總結
- 動手編碼前的計划是很重要的,非常影響效率。
- 學習的技能:
1、Python 關於 Json 的解析
2、Python 命令行參數
3、Git 的使用
4、Python 的單元測試覆蓋率計算
5、Python 的性能測試 - 檢索分析是一項很重要的能力