#Python TQC考題910 學生基本資料
# 資料排列跟904類似可互相參考,使用2D list的概念做
male=female=0
with open(“read.dat”,”rb“) as f:
#rb模式不能加參數 encoding=”utf-8″
#但r模式可以
for line in f:
print(line.decode(“utf-8”))
#不是decoding,也不是decode=”utf-8″
if line.decode(“utf-8”).split()[2] ==”0″: female+=1
#注意0被” “包覆
elif line.decode(“utf-8″).split()[2] ==”1”: male+=1
#注意1被” “包覆
print(“Number of males %d: ” %male)
print(“Number of females %d: ” %female)
“””
使用記事本編輯read.dat內容:
學號 姓名 性別 科系
101 陳小華 0 餐旅管理
202 李小安 1 廣告
303 張小威 1 英文
404 羅小美 0 法文
505 陳小凱 1 日文
“””
male=female=0
with open(“read.dat”,”rb”) as file:
for line in file:
print(line.decode(“utf-8”))
if line.decode(“utf-8″).split()[2] ==”0”: female += 1
elif line.decode(“utf-8″).split()[2] ==”1”: male += 1
print(“number of males is %d” %male)
print(“number of females is %d” %female)
“””
改用2D陣列的概念做:
先把全部資料變成一個2維陣列:
[[‘學號’, ‘姓名’, ‘性別’, ‘科系’], [‘101’, ‘陳小華’, ‘0’, ‘餐旅管理’], [‘202’, ‘李小安’, ‘1’, ‘廣告’], [‘303’, ‘張小威’, ‘1’, ‘英文’], [‘404’, ‘羅小美’, ‘0’, ‘法文’], [‘505’, ‘陳小凱’, ‘1’, ‘日文’]]
再將性別欄位做成一維陣列
index 0是title,而非內容
一維陣列要不要皆可
不影響.count() 計算數量
除了是.dat檔以外
所以用跟904一樣2D陣列的寫法
“””
with open(“read.dat”,”rb”) as file:
data=[]
for line in file:
print(line.decode(“utf-8”))
data.append(line.decode(“utf-8”).split())
print(data) #檢查用,建立了一個2維list
length=len(data)
print(length)
sex=[]
for i in range(1,length):
#index 0是title姓別
sex.append(data[i][2])
print(sex)
female = sex.count(“0″) #注意0被” “包覆
male = sex.count(“1″) #注意1被” “包覆
print(“Number of males: %d” %male)
print(“Number of females: %d” %female)
#放大程式碼:
#放大輸出結果:
#再放大輸出結果:
#再練習一次:
#再練習一次::
“””
以下語法open()時
又不用rb模式了
但使用在910,出現以下錯誤:
UnicodeDecodeError: ‘cp950’ codec can’t decode byte 0x99 in position 4: illegal multibyte sequence
因為910的dat檔含有中文字
若改為僅有英數字,就可正常執行
“””
“””
open()裡面再加encoding=”utf-8″
即可正常執行
“””
“””
原本dat檔
都是採用rb模式開啟
但老師多教r模式開啟
順應老師的教學
再重寫此題910
Debug過程滿有趣
印出list看也沒問題
為何index out of range?
再印len出來看
迴圈多跑了一次,
最後那一次跑出
長度0的空list
break那一行要放對地方
“””
“””
910與904如同雙胞胎姐妹花,資料的排列都雷同,差異為910想要開啟.dat檔
先前都採用rb模式開啟,受限於rb模式,後面就要使用 line.decode(“utf-8”),
這語法只出現在909, 910,老師教使用r模式開啟.dat檔,非常實用,既然可以採用r模式
那就用跟904一樣的解法,做這一題
“””
“””
sex.append(line.split()[2])
如果注意line.split()是一個list
這一行就寫得出來
題目要顯示內容print(line)
很簡單,但不要忘了
“””