CSV模块里的2个类:
class DictReader:
class DictWriter:
DictReader:用字典的形式读取。
DictWriter:以字典的形式写入。
CSV模块DictWriter类的三个方法:
def writeheader(self):
def writerow(self, rowdict):
def writerows(self, rowdicts):
writeheader方法:写入表头。
writerow方法:每次写入一行。
writerows方法:每次写入多行。
定义在类外的函数称为自定义函数。
定义在类里的函数称为方法。
定义在类里方法外的变量称为类属性。
定义在类里方法里的变量称为实例属性。
实例属性是属于实例对象的属性,也称为实例变量
。
【备注】
类的相关知识本就是一个很抽象,没有实操不太能理解的知识。
因为大家初学,实例属性我之前没有讲过,怕把大家绕晕了。
本节引入实例属性概念,铺垫一下以后的知识。
本机大家对实例属性的知识仅做了解,重点是读取csv文件内容。
实例化类创建对象语法:
对象名=类名( )
调用类属性语法:
对象名.属性
调用方法语法:
对象名.方法名(值,…)
【语法总结】
都是对象名开头。
创建对象要用等于号=
。
属性和方法是类自己的东西,用个英文小圆点.
就能实现。
因为方法要传值进去,因此需要紧跟一个英文圆括号()
。
在电脑D盘新建一个【78】文件夹。
用VScode编辑器打开【78】文件夹。
在【78】文件夹中新建一个78.py
文件。
大家在78.py
文件中编写代码。
# 导入os 模块,用于创建文件目录
import os
# 导入 csv 模块,用于操作CSV文件
import csv
# mkdir作用是创建目录
# 括号里的内容是madir函数的参数
# 这里的参数值为相对路径
os.mkdir("各班级成绩")
# 用字典存储要写入CSV文件的信息
dict1 = {'姓名': '刘一', '成绩': '100'}
dict2 = {'姓名': '陈二', '成绩': '90'}
dict3 = {'姓名': '张三', '成绩': '80'}
dict4 = {'姓名': '李四', '成绩': '70'}
dict5 = {'姓名': '王五', '成绩': '60'}
# 设置文件的表头,即列名
header = ['姓名', '成绩']
# 文件的相对路径
file_path = r'各班级成绩\1班成绩单.csv'
# 以自动关闭文件的方式创建文件对象
with open(file_path, 'a', encoding='utf-8', newline="") as f:
# 实例化类 DictWriter(),得到 DictWriter 对象
dr = csv.DictWriter(f, fieldnames=header)
# 写入文件的表头
dr.writeheader()
# writerow每次写入一行
dr.writerow(dict1)
# writerows多行写入
dr.writerows([dict2, dict3, dict4, dict5])
运行上述代码,得到一个【1班成绩单.csv】文件。
文件内容如下:
我们之前都是通过手动的方式打开我们新建的文件查看文件写入的内容。
今天我们要学习用代码的方式查看我们写入的内容。
【体验代码】
# 导入 csv 模块,用于操作CSV文件
import csv
# 1班成绩单.csv文件的相对路径
file_path = r'各班级成绩\1班成绩单.csv'
# 以自动关闭文件的方式创建文件对象f
# mode=r,r表示只读模式
with open(file_path, 'r', encoding='utf-8') as f:
# 实例化类 DictReader,得到DictReader对象
# 以字典的形式获取 csv 文件信息
dr = csv.DictReader(f)
# 查看dr的数据类型
print(type(dr))
# 读取表头
print(dr.fieldnames)
# 打印字典的数据
for row in dr:
print(row)
【终端输出】
['姓名', '成绩']
{'姓名': '刘一', '成绩': '100'}
{'姓名': '陈二', '成绩': '90'}
{'姓名': '张三', '成绩': '80'}
{'姓名': '李四', '成绩': '70'}
{'姓名': '王五', '成绩': '60'}
【open语句的参数】
open(file, mode="", encoding='utf-8', newline="", errors='None')
# 以自动关闭文件的方式创建文件对象f
# mode=r,r表示只读模式
with open(file_path, 'r', encoding='utf-8') as f:
参数file_path
表示要读取的文件的1班成绩单.csv
文件的路径。我这里用的是相对路径,大家也可以用绝对路径。
参数mode=r
这里我只需要读取内容,因此我选用了r
模式。r
模式表示只读取文件。
实例化类创建对象语法:
对象名=类名( )
# 实例化类 DictReader,得到DictReader对象
# 以字典的形式获取 csv 文件信息
dr = csv.DictReader(f)
# 查看dr的数据类型
print(type(dr))
我们向csv文件中写入内容需要实例化DictWriter类。
我们要读取csv文件中的内容需要实例化DictReader类。
对象名是dr
,就是一个变量名字,大家根据自己的喜好起名。因为实例化DictReader类后得到的是一个DictReader对象,因此我起了一个dr的变量名。
csv是模块名。DictReader类是CSV模块里的,因此我们需要加上csv
模块名。表示实例化CSV模块中的DictReader类。
DictReader是类名。
f
是with open语句创建的文件对象。
# 查看dr的数据类型
print(type(dr))
type函数查看dr变量的数据类型。
【终端输出】
<class 'csv.DictReader'>
终端返回的是csv.DictReader
。
即实例化DictReader类后创建了一个csv.DictReader
对象。
Python一切皆对象。我们要读取文件,首先得有一个要读取的文件对象。
我们要以字典的形式读取文件内容,因此我们创建了一个csv.DictReader
对象,可以理解成是一个读取后以字典形式输出内容的对象。
调用属性语法:
对象名.属性
# 读取表头
print(dr.fieldnames)
dr是对象名。
fieldnames是属性名。
fieldnames为什么是属性呢?
这是CSV模块的开发者在编写csv.py
模块时定义好的。
field[fiːld]:字段。
fieldnames 字段名称。
下面的代码是csv模式的DictReader类的部分源代码:
class DictReader:
def __init__(self, f, fieldnames=None, restkey=None, restval=None,
dialect="excel", *args, **kwds):
self._fieldnames = fieldnames # list of keys for the dict
self.restkey = restkey # key to catch long rows
self.restval = restval # default value for short rows
self.reader = reader(f, dialect, *args, **kwds)
self.dialect = dialect
self.line_num = 0
我们发发现__init__
方法中有fieldnames
属性。
list of keys for the dict
翻译为字典的关键字列表
。
我改写一下上面的代码:
class DictReader:
def __init__(self,fieldnames):
self.fieldnames = fieldnames # list of keys for the dict
dr = DictReader(fieldnames= ['姓名', '成绩'])
print(dr.fieldnames)
【终端输出】
['姓名', '成绩']
【语法解析】
class DictReader:
定义一个类。
def __init__(self,fieldnames):
在类中定义一个__init__
初始化方法。
self是固定参数。
fieldnames是__init__
方法的参数。
self.fieldnames = fieldnames
这里多加的slef. 就是实例属性的意思。
在类内部的方法中调用类的属性或其它类的方法时,需要在前面加上slef. 。
dr = DictReader(fieldnames= ['姓名', '成绩'])
实例化类创建对象语法:
对象名=类名( )
dr对象名。
DictReader类名
fieldnames= ['姓名', '成绩']
给参数传的值。
print(dr.fieldnames)
调用类属性语法:
对象名.属性
dr对象名。
fieldnames属性名。
【init方法的作用】
init方法接收创建对象时传入的值。
dr = DictReader(fieldnames= ['姓名', '成绩'])
创建对象传入的值就是['姓名', '成绩']
。
【for循环知识回顾】
name_lsit = ["张三","李四","王五"]
for i in name_lsit:
print(i)
【终端输出】
张三
李四
王五
i
是循环变量,存储从列表中的取到的值。
列表中有3个值,for循环执行了3次。
大家学到这里应该对for循环很熟悉了,如果看到for循环语句还不理解它的作用,那建议不要继续往下学了,应该先回头继续巩固基础知识。
# 打印字典的数据
for row in dr:
print(row)
row是循环变量。
要循环的对象是dr。
dr是csv.DictReader
对象,可以理解成是一个读取后以字典形式输出内容的对象。
CSV模块里的2个类:
class DictReader:
class DictWriter:
DictReader:用字典的形式读取。
DictWriter:以字典的形式写入。
CSV模块DictWriter类的三个方法:
writeheader方法:写入表头。
writerow方法:每次写入一行。
writerows方法:每次写入多行。
【课堂练习】
os创建目录【成绩汇总】。
创建【英语系成绩.csv】文件存储学生成绩。
将下列五个字典写入【英语系成绩.csv】文件;
# 用字典存储要写入CSV文件的信息
dict1 = {'姓名': '刘一', '成绩': '100'}
dict2 = {'姓名': '陈二', '成绩': '90'}
dict3 = {'姓名': '张三', '成绩': '80'}
dict4 = {'姓名': '李四', '成绩': '70'}
dict5 = {'姓名': '王五', '成绩': '60'}
# 导入os 模块,用于创建文件目录
import os
# 导入 csv 模块,用于操作CSV文件
import csv
# mkdir作用是创建目录
# 括号里的内容是madir函数的参数
# 这里的参数值为相对路径
os.mkdir("成绩汇总")
# 用字典存储要写入CSV文件的信息
dict1 = {'姓名': '刘一', '成绩': '100'}
dict2 = {'姓名': '陈二', '成绩': '90'}
dict3 = {'姓名': '张三', '成绩': '80'}
dict4 = {'姓名': '李四', '成绩': '70'}
dict5 = {'姓名': '王五', '成绩': '60'}
# 设置文件的表头,即列名
header = ['姓名', '成绩']
# 文件的相对路径
file_path = r'成绩汇总\英语系成绩.csv'
# 以自动关闭文件的方式创建文件对象
with open(file_path, 'a', encoding='utf-8', newline="") as f:
# 实例化类 DictWriter(),得到 DictWriter 对象
dw = csv.DictWriter(f, fieldnames=header)
# 写入文件的表头
dw.writeheader()
# writerow每次写入一行
dw.writerow(dict1)
# writerows多行写入
dw.writerows([dict2, dict3, dict4, dict5])
with open(file_path, 'r', encoding='utf-8') as f:
# 实例化类 DictReader,得到DictReader对象
# 以字典的形式获取 csv 文件信息
dr = csv.DictReader(f)
# 读取表头
print(dr.fieldnames)
# 打印字典的数据
for row in dr:
print(row)
【终端输出】
['姓名', '成绩']
{'姓名': '刘一', '成绩': '100'}
{'姓名': '陈二', '成绩': '90'}
{'姓名': '张三', '成绩': '80'}
{'姓名': '李四', '成绩': '70'}
{'姓名': '王五', '成绩': '60'}