python隨筆小題-對於csv的操作技巧及numpy權重計算
阿新 • • 發佈:2020-12-22
假設現在存在一個csv檔案,姑且叫做“成績單.csv”吧,裡面的內容大致如下:
那麼現在嘗試在最後新增一列叫做‘最終成績’,且最終成績的計算準則為:將考勤、作業、期末三項分別以權重0.22, 0.18, 0.6 來計算並相加,且儲存到該csv檔案中,那麼應該怎麼做?
對於這個問題,嘗試使用python內建的csv以及安裝好的numpy模組來操作,首先引用相應模組:
import csv, numpy as np
隨後嘗試使用open函式對檔案進行讀取(下列程式碼預先假設檔案存放在D盤根目錄):
with open("D:\\成績單.csv", 'r') as f:
reader = csv.reader(f)
rows = [row for row in reader]
這樣,csv中的每一行便以列表內元素的形式存到rows中去了,且rows[0]為標頭。
因為本身csv模組並不能支援單獨增加一列,所以這個地方“暴力”了一點,直接把csv原始檔用覆蓋的方式開啟(讀寫操作選擇了‘w’,就意味著在開啟的一瞬間,該檔案內容就被清空了,這個地方務必要慎重!):
# newline 引數給空字元是為了防止寫入時寫一行空一行
with open("D:\\成績單.csv", 'w', newline='') as f:
writer = csv.writer( f)
然後,先給標頭後面新增‘最終成績’:
rows[0] += ['最終成績']
writer.writerow(rows[0])
再依次按照權重計算出相應的成績。
weights = [0.22, 0.18, 0.6]
for i in rows[1:]:
# 將每個元素從字串轉換為整數,用於計算
s = []
for j in i[1:]:
s.append(int(j))
i += ['%.2f' % np.average(s, weights = weights)]
writer.writerow(i)
也可以寫的再簡單點:
weights = [0.22, 0.18, 0.6]
for i in rows[1:]:
i += ['%.2f' % np.average(list(map(int, i[1:])), weights=weights)]
writer.writerow(i)
這樣,檔案結果如下:
完整程式碼如下:
import csv, numpy as np
# 先讀
with open("D:\\成績單.csv", 'r') as f:
reader = csv.reader(f)
rows = [row for row in reader]
# 再寫
with open("D:\\成績單.csv", 'w', newline='') as f:
writer = csv.writer(f)
rows[0] += ['最終成績']
writer.writerow(rows[0])
weights = [0.22, 0.18, 0.6]
for i in rows[1:]:
i += ['%.2f' % np.average(list(map(int, i[1:])), weights=weights)]
writer.writerow(i)
小坑: 記得寫入時給newline賦值空字元,避免寫入時空行的問題,什麼是空行?newline去掉試試就知道咯,坑的我不行不行的。