
(1)用for的i默认是从0开始,如果想要要从1开始遍历,可以对后面的range处理
(2)题目是不用pandas对csv文件(数据之间是逗号间隔)处理,所以需要利用open后readlines后的每行数据,依次找到当前的第一个,位置,然后将前面用过的数据去掉。如下如处理:
with open("student.csv") as file:
con = file.readlines()
# print(con)
for i in range(1, len(con)):
line = con[i]
文章目录
一个csv表有姓名、性别、成绩,用python得出男生和女生分别的的平均分,并且排序输出大于平均分的学生名单,不要直接用python自带的函数,最好自己敲排序和求平均数的函数
如果直接用pandas相信所有人都知道用pandas.read_csv函数或者使用csv,而如果只不能用pandas,则用open打开文件后用readlines读取csv文件的多行内容。
一、不用pandas首先自己先随便写个csv文件的学生数据(csv文件的数据以逗号间隔):
姓名,性别,成绩 佩奇哥,男,20 刘德华,男,100 张学友,女,40 张继科,男,80 杨幂,女,60
# -*- coding: utf-8 -*-
"""
Created on Wed Sep 29 17:07:02 2021
@author: 86493
"""
# 方法三改进:只使用open
classmate = {}
lst = []
class student:
def __init__(self, name, sex, score):
self.name = name
self.sex = sex
self.score = score
self.StudentDict = {'name': name,
'sex': sex,
'score': score}
"""
exp = "andyguo"
ret = exp.find(',')
print(ret) # -1表示没有找到结果
"""
with open("student.csv") as file:
con = file.readlines()
# print(con)
for i in range(1, len(con)):
line = con[i]
line = line.replace("n", "") # 把最后一个n去掉
# print(line)
pos1 = line.find(',')
name = line[:pos1]
sex = line[pos1 + 1]
score = line[pos1 + 3:]
stu = student(name, sex, score)
# print(stu.StudentDict)
classmate.update({stu.name: stu.StudentDict})
lst.append(stu.StudentDict)
print("全班同学的字典:n", classmate)
# 求男女生的平均分
BoyNum, GirlNum, BoyScoreSum, GirlScoreSum = 0, 0, 0, 0
EndBoyLst, EndGirlLst = [], []
for astu in lst:
astu['score'] = int(astu['score'])
if astu['sex'] == '男':
# print(astu['score'])
# print(type(astu['score'])) # 如果没加上int那句则是
BoyScoreSum += astu['score']
BoyNum += 1
#EndBoyLst.append(astu['name']) # 加入男生结果列表
elif astu['sex'] == '女':
GirlScoreSum += astu['score']
GirlNum += 1
#EndGirlLst.append(astu['name'])
baverage = BoyScoreSum / BoyNum
gaverage = GirlScoreSum / GirlNum
# 判断并存入结果
for astu in lst:
astu['score'] = int(astu['score'])
if astu['sex'] == '男' and astu['score'] > baverage:
EndBoyLst.append(astu['name']) # 加入男生结果列表
elif astu['sex'] == '女' and astu['score'] > gaverage:
EndGirlLst.append(astu['name'])
print("过平均分的男生:n", EndBoyLst)
print("过平均分的女生:n", EndGirlLst)
结果为:
全班同学的字典:
{'佩奇哥': {'name': '佩奇哥', 'sex': '男', 'score': '20'},
'刘德华': {'name': '刘德华', 'sex': '男', 'score': '100'},
'张学友': {'name': '张学友', 'sex': '女', 'score': '40'},
'张继科': {'name': '张继科', 'sex': '男', 'score': '80'},
'杨幂': {'name': '杨幂', 'sex': '女', 'score': '60'}}
过平均分的男生:
['刘德华', '张继科']
过平均分的女生:
['杨幂']
二、pandas库
# -*- coding: utf-8 -*-
"""
Created on Wed Sep 29 15:00:45 2021
@author: 86493
"""
# 方法一:用pandas读取csv
import pandas as pd
file = pd.read_csv('student.csv', encoding = 'GB18030')
df = pd.Dataframe(file)
print(df)
print(df.shape) # (5, 3)即五行三列
classmate = {}
class student:
def __init__(self, name, sex, score):
self.name = name
self.sex = sex
self.score = score
self.StudentDict = {'name': name,
'sex': sex,
'score': score}
for i in range(df.shape[0]):
print(i)
name = df.loc[i, '姓名']
sex = df.loc[i, '性别']
score = df.loc[i, '成绩']
stu = student(name, sex, score)
# print(stu.StudentDict)
classmate.update({stu.name: stu.StudentDict})
print(classmate)
结果为:
姓名 性别 成绩
0 佩奇哥 男 20
1 刘德华 男 100
2 张学友 女 40
3 张继科 男 80
4 杨幂 女 60
(5, 3)
0
1
2
3
4
{'佩奇哥': {'name': '佩奇哥', 'sex': '男', 'score': 20},
'刘德华': {'name': '刘德华', 'sex': '男', 'score': 100},
'张学友': {'name': '张学友', 'sex': '女', 'score': 40},
'张继科': {'name': '张继科', 'sex': '男', 'score': 80},
'杨幂': {'name': '杨幂', 'sex': '女', 'score': 60}}
三、csv库
# -*- coding: utf-8 -*-
"""
Created on Wed Sep 29 16:48:30 2021
@author: 86493
"""
# 方法二:用csv函数读取csv
import numpy as np
import csv
classmate = {}
class student:
def __init__(self, name, sex, score):
self.name = name
self.sex = sex
self.score = score
self.StudentDict = {'name': name,
'sex': sex,
'score': score}
with open('student.csv', encoding = 'GB18030')as csvfile:
spamreader = csv.reader(csvfile)
for row in spamreader:
print(row)
print(row[0])
name = row[0]
sex = row[1]
score = row[2]
stu = student(name, sex, score)
# print(stu.StudentDict)
classmate.update({stu.name: stu.StudentDict})
print(classmate)
结果为:
['姓名', '性别', '成绩']
姓名
['佩奇哥', '男', '20']
佩奇哥
['刘德华', '男', '100']
刘德华
['张学友', '女', '40']
张学友
['张继科', '男', '80']
张继科
['杨幂', '女', '60']
杨幂
{'姓名': {'name': '姓名', 'sex': '性别', 'score': '成绩'},
'佩奇哥': {'name': '佩奇哥', 'sex': '男', 'score': '20'},
'刘德华': {'name': '刘德华', 'sex': '男', 'score': '100'},
'张学友': {'name': '张学友', 'sex': '女', 'score': '40'},
'张继科': {'name': '张继科', 'sex': '男', 'score': '80'},
'杨幂': {'name': '杨幂', 'sex': '女', 'score': '60'}}
Reference
(1)python读取cvs文件内容如何区分分隔逗号和内容中的逗号
(2)python读取csv文件的三种方式