DevOps-Programming Basics with Python 16
當前先清空前面課程所有的程式內容剩下空的main.py:
然後將處理一個Spreadsheet檔案,內容大致如下:
上面就是一個公司內常見的表格資料範例
然後接下來會讀取其內容來做一些演練:
- 計算各個供應商(Supplier)有多少種商品(Product)
- 計算出各家供應商各自商品的價值加總
- 列出庫存(Inventory)低於10的商品(Product)列表(例如25號商品只有7個庫存,則印出{25:7})
- 往右邊寫出額外一欄位,裡面計算並寫出每個商品的庫存價值到表格內
Install Package
首先先將該清單檔案放到專案內,複製到專案目錄下
接著就要讓Python先讀取清單檔案內容
有許多各種不同的檔案處理的方法
Python就有很多built-in的module來處理檔案例如
io module(用來create,read,write)
另外還有專門處理Spreadsheet檔案的Package
提供了更多好用的Function來處理Spreadsheet檔案
並且更容易使用
所以到pypi上查找"openpyxl"
複製pip安裝指令後到PyCharm的Terminal上執行
然後看到出現在:
這邊可以額外看到在site-packages底下有些目錄有帶一個點:
也就是有"點"的才是Python的Package
沒有"點"的裡面沒有__init__.py檔,也就不是Python的Package
另外就是有"點"的底下目錄居然還有"點"的目錄在裡面
也就是它是有階層(hierarchy)關係的
也就是有Package內還有其他Package
所以簡單的劃分關係:
- Module = .py file
- Package = 一堆的Module,並且有init.py檔
- Library = 一堆的Package,並且有階層關係
所以這邊看到的才會是:
Implementation
這邊開始使用剛剛安裝的openpyxl Library來讀檔,基本寫法如下:
而表格Excel檔內可以有多個Sheet,首先我們要知道Sheet名稱,打開檔案看到
再讀出這個Sheet的內容為新變數:
Exercise 1 — 計算各個供應商(Supplier)有多少種商品(Product)
從表格資料中明顯可以知道有三家供應商(AAA,BBB,CCC)
在撰寫邏輯過程就會需要查閱openpyxl的文件
找到像是最大筆數 →max_row
首先定義最後結果要輸出的格式像這樣:
{"AAA Company": 43, "BBB Company": 17,"CCC Company": 14}
所以先宣告一個結果變數:
然後印出最大筆數:
然後原本預計是要這樣寫迴圈讀取每一行資料的:
但是product_list.max_row其實只是一個75的數字
取而代之應該是要把75放在一個range內變成
也就可以拿到0~74項次
接著還要修正的是第一行是標題
所以要排除掉第一個row(也就是第0項),變成:
這邊有一個Python的觀念
如上的range的2 ~ product_list.max_row
也就是2 ~ 75代表的是不包含75
所以再次修正後變成:
而取得某一行的第四個欄位,也就是供應商名稱的方式則是:
然後撰寫重複計算增加的邏輯如下:
接著還有一個要修正的是,目前supplier_name拿到的其實是:
如上看到其實只是Excel的欄位位置,實際拿到值還要:
最後修改並印出結果:
另一個從products_per_supplier中用特定key拿到value的方式還有get(key)
Exercise 2 — 計算出各家供應商各自商品的價值加總
在知道變數取名後,我自己嘗試撰寫邏輯如下
印出來得到
Exercise 3 — 列出庫存(Inventory)低於10的商品(Product)列表(例如25號商品只有7個庫存,則印出{25:7})
印出得到:
像是第74個只有2個庫存:
另外可以注意到結果值是float,可以簡單調整成整數:
印出結果變成:
Exercise 4 — 往右邊寫出額外一欄位,裡面計算並寫出每個商品的庫存價值到表格內
直接進入到該格子(cell)其實很簡單如下:
然後簡單計算並寫入:
但是寫完後要儲存,這邊最後儲存成另一個檔案則是:
完整印出上面的練習題結果:
完整的Code如下:
執行後看到:
打開inventory_with_total_value.xlsx檔案看到:
以上就完成四個練習