攝影或3C

Python TQC考題910 學生基本資料, print(line.decode(“utf-8”)), if line.decode(“utf-8″).split()[2] ==”0”: female += 1

#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類似

所以用跟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)

很簡單,但不要忘了

“””

儲蓄保險王

儲蓄險是板主最喜愛的儲蓄工具,最喜愛的投資理財工具則是ETF,最喜愛的省錢工具則是信用卡