1. 程式人生 > 其它 >python隨筆小題-對於csv的操作技巧及numpy權重計算

python隨筆小題-對於csv的操作技巧及numpy權重計算

假設現在存在一個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去掉試試就知道咯,坑的我不行不行的。