Skip to content

CSV操作

csvexcel类似,但csv只专注数据本身

提示

学习前,请复制以下内容,自行创建一个student.csv文件,粘贴内容并保存

id,name,age,score
1,张三,18,90
2,李四,17,85
3,王五,18,92
4,赵六,16,70
idnameagescore
1张三1890
2李四1785
3王五1892
4赵六1670

观察这个表格,它有45行(含表头)

读入csv并打印表内容

提示

每次使用csv时,需要导入csv

py
import csv
py
with open(文件路径, 模式, encoding=文件编码) as 写入变量:

文件名: 我们需要操作的文件路径

模式:

模式解释作用
"r"read只读
"w"write写入(会删除原有的内容,写入全新内容)
"a"append追加(不会删除原有内容,只会在尾部添加内容)

文件编码: 默认utf-8

写入变量: 用什么变量存储读入的内容

打开与关闭

py
file =  open("students.csv","r",encoding="utf-8")
print(file.read())
file.close()

自动关闭(推荐)

py
with open("students.csv","r",encoding="utf-8") as f:
    print(f.read())

按行读取

py
with open("students.csv","r",encoding="utf-8") as f:
    reader = csv.reader(f) #将读取到的内容写入 reader
    next(reader) #跳过一行(这里指的是表头)
    for row in reader:
        print(row)

打印结果

shell
['1', '张三', '18', '90']
['2', '李四', '17', '85']
['3', '王五', '18', '92']
['4', '赵六', '16', '70']

按列读取 DictReader

py
with open("students.csv", "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(row["name"], row["score"])

打印结果

shell
张三 90
李四 85
王五 92
赵六 70

特殊处理

数值处理

在读入csv时,若某个内容是数值的,那么需要转为对应的数据类型

例如: 这里的成绩是整数的,在使用数值操作前需要转为数值

计算所有学生的成绩的和

py
import csv

with open("students.csv", "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    total_score = 0
    for row in reader:
        score = int(row["score"])
        total_score += score

print("总成绩:", total_score) # 总成绩: 337

在这里,第7行的内容中,使用了int()将其转为int类型,当然也可以使用float()

练习题

打印已成年学生的姓名和成绩

点我查看答案
py
import csv

with open("students.csv", "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for row in reader:
        age = int(row["age"])
        if age >= 18:
            print(f"姓名:{row['name']},成绩:{row['score']}")

计算所有学生的成绩平均分

点我查看答案
py
import csv

total = 0
count = 0

with open("students.csv", "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for row in reader:
        score = int(row["score"])
        total += score
        count += 1

avg = total / count
print(f"平均分:{avg:.2f}")

只打印成绩大于等于 90 的学生

点我查看答案
py
import csv

with open("students.csv", "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for row in reader:
        if int(row["score"]) >= 90:
            print(row)

单独打印出所有学生的姓名

点我查看答案
py
import csv

with open("students.csv", "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(row["name"])