問題描述
利用記事本創建一個a.csv文件,內容如下:
姓名,語文,數學,英語,總分
張三,80,80,80,240
李四,90,90,90,270
王五,70,70,70,210
趙六,70,80,90,240
編程完成以下功能:
- 1.讀取
a.csv
文件的數據內容 - 2.最後增加一列,名稱爲‘排名’
- 3.根據總分得到正確的排名並打印輸出
- 4.將包含排名列的所有數據保存爲
a.json
文件 - 5.提交代碼和運行截圖。
代碼實現
"""
@author: shoo Wang
@contact: [email protected]
@file: demo04.py
@time: 2020/4/27 0027
"""
import json
# f1 負責讀入文件, f2 負責寫入文件 + 代表同時具備讀寫功能
f1 = open('./a.csv', 'r+', encoding='utf-8')
f2 = open('./a.json', 'w+', encoding='utf-8')
# 使用列表推導式, 獲取二維結構
table = [i.strip('\n').split(',') for i in f1.readlines()]
# 表頭增加排名,然後我們就不需要表頭了,因爲它沒法排序
table[0].append('排名')
# 由於 sort 函數和 extend 函數都是沒有返回值的
# 所以我們必須事先存儲待處理變量,如果題目中沒給總分可以 sum([int(j) for j in x[1:]])
sortList = table[1:]
sortList.sort(key=lambda x: x[-1], reverse=True)
# 增加排名數字
for i in range(len(sortList)):
sortList[i].append(str(i + 1))
# 表頭加上已經排好序的表體
listHead = table[:1]
listHead.extend(sortList)
# 得到 Python 數據類型的 listHead
# 現在轉化成 json 數據類型
# 1.首先建立映射關係,zip() 函數返回的是 zip 類型
# 我們要把 zip 類型轉化成 字典類型;
toJson = []
for i in listHead[1:]:
toJson.append(dict(zip(listHead[0], i)))
# 2.寫入文件, dump 直接寫入文件, dumps 返回 json 數據
json.dump(toJson, f2, ensure_ascii=False, indent=4)
# 釋放資源
f1.close()
f2.close()
我也不是一次編寫完成的,是在不斷的試錯中一步一步的解決這個問題的,令我印象最深刻的就是這個sort
函數的用法,需要傳入一個回調函數,這裏是以列表元素的最後一個值作爲key
,我之前在做的時候忘記了題目中已經給了總分,還使用了sum([int(j) for j in x[1:]])
這個排序,多此一舉。