iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 21
0
AI & Data

看對話學 Python 資料分析,用情境故事帶你入門系列 第 21

Day-21 開檔讀檔,學會讀取檔並進行簡單計算(中)

  • 分享至 

  • twitterImage
  •  


要怎麼從 JSON 檔案中,算出豬排賣出幾分?Licensed by Adobe Stock

Jason:「確認檔案沒問題之後,首先,我們要import json這個模組,你記得我們前面有提到import是做什麼嗎?」

Meiko:「就是站在巨人的肩膀上!」

Jason:「沒錯,因為我們讀取的檔案是 JSON 格式,Python 已經有處理 JSON 格式的模組,所以我們 import 它來幫我們讀取內容。接下來,我們就先來把 ouptutOrder.json 這個檔案裡面的內容,讀出來,看看有什麼東西!我們先用fileName=open("outputOrder.json")把剛剛上傳到雲端的檔案用open()這個函式,將檔案指定到fileName這個變數。」

Meiko:「所以你的意思是 outputOrder.json 這個檔案,之後都可以用fileName來代表囉?」

Jason:「沒錯,所以你看再來就可以用json.loads()這個在 JSON 模組中的函式,我們發現,在 json.loads() 之中,有一個 filenName.read() 意思是就是讀檔。這整行的意思就是透過 JSON 模組,把 fileName 讀出來的檔案放到 jsonLoadData 裡面去,最後我們再用 print(jsonLoadData) 看會印出什麼東西?」

import json
fileName=open("outputOrder.json")
jsonLoadData=json.loads(fileName.read())
print (jsonLoadData)

Meiko:「看起來有印出像訂單一樣的資料耶!不過這份訂單有點多,顯示起來就變得需要用滑鼠一直往右拉!Jason 有辦法,讓這些訂單資料比較容易觀察嗎?」

Jason:「你記得我們前面有教過用for-loop來跑 list 嗎?」

Meiko:「歐,有,先前你只有把我和你的訂單放到一個list裡面,所以只有 2 份餐點的資訊,所以這次,我想一下怎麼做...」

Meiko:「一樣用for-loop但要注意是 list 所以用先用len讓程式知道它的長度。然後,我用一個 index i 去讓for-loop跑過一個個的訂單,應該會像這樣吧?」

for i in range(len(jsonLoadData)):

Jason:「看來你對for-loop蠻熟的囉,沒錯,那你試著把jsonLoadData用 index i 印出來!」

Meiko:「哈,我雖然想得到,不過寫起來還是抖抖的,會是這樣吧?」

import json

fileName=open("outputOrder.json")
jsonLoadData=json.loads(fileName.read())

for i in range(len(jsonLoadData)):
 print (jsonLoadData[i])

Jason:「看起來沒什麼問題囉!感覺你已經可以處理資料了!」

Meiko:「可是如果我只想要看某個訂單它排第幾個順序,還有訂單的餐點是什麼?要怎麼做?」

Jason:「你可以直接把想印的 key 寫出來,比如說我們想要知道 orderId 和 content,我們直接可以把 jsonLoadData 當作是個二維的矩陣,分別用 index i 搭配 orderId 或是 content 來顯示。」

import json
fileName=open("outputOrder.json")
jsonLoadData=json.loads(fileName.read())

for i in range(len(jsonLoadData)):
 print (jsonLoadData[i]['orderId'],jsonLoadData[i]['content'])

Meiko:「誒,Jason,這樣不錯耶,可以直接把餐點的單號和餐點的內容拿出來,可是如果我不想每次print() 的時候,都印那麼多東西,可以怎麼做?」

Jason:「我自己有個習慣,會先把jsonLoadData[i]指定到一個變數,然後之後就都從那個變數取資料,因為原本的jsonLoadData這樣的型式,就是前面提到的一種二維陣列 jsonLoadData[][],你先用 index i 選到特定編號的位置,然後再用 'orderId' 或是 'content' 去選到特定的 key,但是對於在思考資料結構的時候,如果你先用

localDic=jsonLoadData[i]

那之後,你就可以專注在第 i 個jsonLoadData(我已經把它指定到localDic裡了) 。之後,你想要存取這份資料的第 i 個元素,就可以用localDic做代表。」

import json

fileName=open("outputOrder.json")
jsonLoadData=json.loads(fileName.read())

for i in range(len(jsonLoadData)):
 localDic=jsonLoadData[i]
 print (localDic['orderId'],localDic['content'])

Meiko:「真的耶,你在print()的時候,就不會用到jsonLoadData[i]['orderId']而是用 localDic['orderId']。這樣看起來清爽多了!」

Meiko:「誒,Jason 可是我讀進檔案後可以做什麼?我還是不知道?」

Jason:「讀進檔案之後,我們就可以用到數據的力量!比如說咖哩店老闆一天做了 100 筆訂單,老闆要你告訴他這 100 筆訂單,賣了幾分牛肉咖喱、豬排咖哩、雞肉咖哩或是可樂餅咖哩?顧客是比較喜歡點辛口還是甘口?所以老闆要怎麼備料?平日和假日的銷售差距?什麼樣的餐點搭售的效果會比較好?如果還可以搭配服務人員現場的回饋,那對於整體餐廳的營運就會很有價值!」

Meiko:「這樣我就懂了!早說麻~能夠處理這些數據,老闆一定會對我刮目相看!」

Jason:「先別高興得太早,那你打算從哪一個部分開始算起?」

Meiko:「歐對轟!有種精神式勝利的感覺。那我們先從知道賣了幾分主餐開始吧?要怎麼備多少料,成本很重要!餐廳的老闆應該也會很想知道!」

Jason:「好,因為咖哩店有 4 個主餐,所以我們就需要去比對賣出了哪些餐點,而且還要計算賣出了幾個,那我們就先來看這 10 筆訂單裡面有多少個『豬排』套餐吧!」

Pork=0
for i in range(len(jsonLoadData)):
 localDic=jsonLoadData[i]
 mainDish=localDic['content']
 if "豬排" in mainDish:
   Pork=Pork +1
print ("豬排賣了 %s 個"%(Pork))

Meiko:「不錯耶!這麼快就知道賣出了 4 個豬排套餐,誒 Jason 我從這段開始不懂了,你解釋給我聽一下?」

mainDish=localDic['content']

Jason:「那行的意思是就把localDic中 key 為 'content' 對應的值指定給變數mainDish,忘記 localDic['content'] 是什麼了嗎?它就是我們主餐的名字拉, 比如說辛口豬排咖哩、辛口牛肉咖喱這些。」

Meiko:「Okay 所以你的意思是先把主餐的名字叫出來放到mainDish裡面?」

Jason:「答對了!」

Meiko:「那接下來這行的意思是什麼?」

if "豬排" in mainDish:
   Pork=Pork+1

Jason:「這邊我用到 Python 的字串比對 in 的功能,也就是如果在 mainDish 裡面有”豬排”這兩個字的話,我就接著做下面這排

Pork=Pork+1

的程式碼,還有你看到我程式的最上方,在for-loop的前面一行有先做一個Pork=0的宣告嗎?」

Meiko:「哪裏?歐,我看到了,怎麼這麼不明顯呀?」

Jason:「哈,因為你現在還不熟悉拉,如果沒有設定的話,程式就會出錯囉!」

Meiko:「歐,所以說如果我想要知道牛排、雞肉和可樂餅的話,也可以用同樣的方式,就可以算出來囉?」

Jason:「對啊~這部分就留給你去發掘囉!」

牛刀小試

我大寶寶~拉,今天我們將 JSON 檔案透過 filename.read()json.loads()讀入我們的程式。接著,我們就使用 for-loop還有先前有提過dictionary的概念,去理解資料欄位中的 key 對應的數值是什麼。留一個小小的練習給大家,請在資料中,把 'taste' 這個 key 對應的數值印出來,看看這 10 筆訂單,是『辛口』賣得比較好,還是『甘口』賣得比較好?

你可能會覺得,剛開始看這些可能會覺得有點複雜,可是如果習慣了這些方式,之後處理 JSON 檔,或是一些從網路上擷取一些爬蟲資料,都會變得得心應手唷!

給大寶寶留言、分享、鼓勵

歡迎登入留言跟我分享你的想法唷!(登入不麻煩,點一下 FB 登入就可以留言了!)

1.喜歡這樣方式學 Python 的朋友請留言『+1』
2.如果前面的內容忘記了,趕快看一下大寶寶這一系列的看對話學 Python 資料分析,用情境故事帶你入門的列表!就能夠繼續 Happy Coding 囉!


上一篇
Day-20 開檔讀檔,學會讀取檔並進行簡單計算(上)
下一篇
Day-22 開檔讀檔,學會讀取檔並進行簡單計算(下)
系列文
看對話學 Python 資料分析,用情境故事帶你入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言