78. Python DictReader类读取csv文件(含源代码解析)

78. Python DictReader类读取csv文件(含源代码解析)

文章目录

    • 78. Python DictReader类读取csv文件(含源代码解析)
    • 1. 知识回顾
      • 1.1 CSV模块知识
      • 1.2 类的相关概念
      • 1.3 类的语法知识
    • 2. 准备工作
    • 3. DictWriter类以字典的形式写入
    • 4. DictReader类以字典的形式读取文件内容
    • 5. 语法解析
      • 5.1 with open 语句创建文件对象
      • 5.2 实例化类,创建对象
      • 5.3 读取文件的表头
      • 5.5 DictReader类的fieldnames属性
      • 5.6 for 循环输出字典
    • 6. 代码总结
      • 6.1 csv模块知识总结
      • 6.2 代码总结

1. 知识回顾

1.1 CSV模块知识

CSV模块里的2个类:

class DictReader:    
class DictWriter:

DictReader:用字典的形式读取。

DictWriter:以字典的形式写入。

CSV模块DictWriter类的三个方法:

def writeheader(self):
def writerow(self, rowdict):
def writerows(self, rowdicts):

writeheader方法:写入表头。

writerow方法:每次写入一行。

writerows方法:每次写入多行。

1.2 类的相关概念

定义在类的函数称为自定义函数

定义在类的函数称为方法

定义在类里方法的变量称为类属性

定义在类里方法的变量称为实例属性

实例属性是属于实例对象的属性,也称为实例变量

【备注】

类的相关知识本就是一个很抽象,没有实操不太能理解的知识。

因为大家初学,实例属性我之前没有讲过,怕把大家绕晕了。

本节引入实例属性概念,铺垫一下以后的知识。

本机大家对实例属性的知识仅做了解,重点是读取csv文件内容。

1.3 类的语法知识

实例化类创建对象语法:

对象名=类名( )

调用类属性语法:

对象名.属性

调用方法语法:

对象名.方法名(值,…)

【语法总结】

都是对象名开头。

创建对象要用等于号=

属性和方法是类自己的东西,用个英文小圆点.就能实现。

因为方法要传值进去,因此需要紧跟一个英文圆括号()

2. 准备工作

  1. 在电脑D盘新建一个【78】文件夹。

  2. 用VScode编辑器打开【78】文件夹。

  3. 在【78】文件夹中新建一个78.py文件。

  4. 大家在78.py文件中编写代码。

3. DictWriter类以字典的形式写入

# 导入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】文件。

文件内容如下:

78. Python DictReader类读取csv文件(含源代码解析)_第1张图片

我们之前都是通过手动的方式打开我们新建的文件查看文件写入的内容。

今天我们要学习用代码的方式查看我们写入的内容。

4. DictReader类以字典的形式读取文件内容

【体验代码】

# 导入 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'}

5. 语法解析

5.1 with open 语句创建文件对象

【open语句的参数】

open(file, mode="", encoding='utf-8', newline="", errors='None')
# 以自动关闭文件的方式创建文件对象f
# mode=r,r表示只读模式
with open(file_path, 'r', encoding='utf-8') as f:
  1. 参数file_path表示要读取的文件的1班成绩单.csv文件的路径。我这里用的是相对路径,大家也可以用绝对路径。

  2. 参数mode=r这里我只需要读取内容,因此我选用了r模式。r模式表示只读取文件。

78. Python DictReader类读取csv文件(含源代码解析)_第2张图片

5.2 实例化类,创建对象

实例化类创建对象语法:

对象名=类名( )

# 实例化类 DictReader,得到DictReader对象
# 以字典的形式获取 csv 文件信息
dr = csv.DictReader(f)
# 查看dr的数据类型
print(type(dr))

我们向csv文件中写入内容需要实例化DictWriter类。

我们要读取csv文件中的内容需要实例化DictReader类。

  1. 对象名是dr,就是一个变量名字,大家根据自己的喜好起名。因为实例化DictReader类后得到的是一个DictReader对象,因此我起了一个dr的变量名。

  2. csv是模块名。DictReader类是CSV模块里的,因此我们需要加上csv模块名。表示实例化CSV模块中的DictReader类。

  3. DictReader是类名。

  4. f是with open语句创建的文件对象。

# 查看dr的数据类型
print(type(dr))

type函数查看dr变量的数据类型。

【终端输出】

<class 'csv.DictReader'>

终端返回的是csv.DictReader

即实例化DictReader类后创建了一个csv.DictReader对象。

Python一切皆对象。我们要读取文件,首先得有一个要读取的文件对象。

我们要以字典的形式读取文件内容,因此我们创建了一个csv.DictReader对象,可以理解成是一个读取后以字典形式输出内容的对象。

5.3 读取文件的表头

调用属性语法:

对象名.属性

# 读取表头
print(dr.fieldnames)
  1. dr是对象名。

  2. fieldnames是属性名。

fieldnames为什么是属性呢?

这是CSV模块的开发者在编写csv.py模块时定义好的。

5.5 DictReader类的fieldnames属性

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__初始化方法。

  1. self是固定参数。

  2. fieldnames是__init__方法的参数。

self.fieldnames = fieldnames 

这里多加的slef. 就是实例属性的意思。

在类内部的方法中调用类的属性其它类的方法时,需要在前面加上slef.

dr = DictReader(fieldnames= ['姓名', '成绩'])

实例化类创建对象语法:

对象名=类名( )

dr对象名。

DictReader类名

fieldnames= ['姓名', '成绩']给参数传的值。

print(dr.fieldnames)

调用类属性语法:

对象名.属性

dr对象名。

fieldnames属性名。

【init方法的作用】

init方法接收创建对象时传入的值。

dr = DictReader(fieldnames= ['姓名', '成绩'])

创建对象传入的值就是['姓名', '成绩']

5.6 for 循环输出字典

【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对象,可以理解成是一个读取后以字典形式输出内容的对象。

6. 代码总结

6.1 csv模块知识总结

CSV模块里的2个类:

class DictReader:    
class DictWriter:

DictReader:用字典的形式读取。

DictWriter:以字典的形式写入。

CSV模块DictWriter类的三个方法:

writeheader方法:写入表头。

writerow方法:每次写入一行。

writerows方法:每次写入多行。

6.2 代码总结

【课堂练习】

  1. os创建目录【成绩汇总】。

  2. 创建【英语系成绩.csv】文件存储学生成绩。

  3. 将下列五个字典写入【英语系成绩.csv】文件;

# 用字典存储要写入CSV文件的信息
dict1 = {'姓名': '刘一', '成绩': '100'}
dict2 = {'姓名': '陈二', '成绩': '90'}
dict3 = {'姓名': '张三', '成绩': '80'}
dict4 = {'姓名': '李四', '成绩': '70'}
dict5 = {'姓名': '王五', '成绩': '60'}
  1. 分别读取写入的表头和内容。
# 导入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'}

你可能感兴趣的:(Python基础知识,python,开发语言)