安迪Python
2023/03/06阅读:27主题:默认主题
75. CSV文件的写入(保姆级教程)
推荐最保姆的教程!!!
75. CSV文件的写入(保姆级教程)
1. 目标任务
-
新建【各班级成绩】文件夹;
-
在该文件夹下新建一个【1班成绩单.csv】文件;
-
在该文件中写入下面的内容:
成绩 姓名
刘一 100
陈二 90
2. 什么是CSV文件
2.1 CSV文件知识
CSV文件和TXT文件一样,一种纯文本文件。
CSV 是 “Comma-Separated Values(逗号分割的值)” 的首字母缩写。
comma [ˈkɒmə]:逗号。
separated[ˈsepəreɪtɪd]:分开的。
values [ˈvæljuːz]:值。
逗号分割的值意思就是用逗号把不同的值进行分割。
CSV文件中的数据是纯文本的形式, 不同行的值(数据)之间,通过英文逗号,
进行分割。
CSV文件文件的第一行相当于Excel表格的列名。
CSV文件可以通过记事本打开,也可以通过Excel软件打开。
【CSV文件和Excel表格的区别】
Excel表格的功能很丰富,样式美观;但占据比较多的存储空间,读写的耗时较长。
CSV文件没有样式,读写速度块;相比Excel表格,CSV文件没有最大行。
Python爬虫项目实操中,我们通常用CSV文件和JSON文件来存储解析到的网页数据。
今天我们先学习CSV文件的操作。
下面,我们来手动新建一个CSV文件。
2.2 准备工作
在电脑D盘新建一个【75】文件夹,在该文件下进行如下操作。
2.3 实操练习1
-
新建一个txt记事本,将其重命名为 1班成绩单.CSV
。

-
右键点击
1班成绩单.CSV
文件,打开方式选择【Excel】 -
打开后,在A1单元格中输入
姓名
,在B1单元格中输入成绩
。

如果你用Excel打开CSV文件,你会发现其实CSV文件就是一个简易版的Excel。
-
关闭保存文件。
-
再次右键点击
1班成绩单.CSV
文件,打开方式选择【记事本】。 -
我们发现
姓名
和成绩
之间有一个英文逗号,
。
这是因为CSV文件的值是以英文逗号进行分割的。
-
关闭并保存文件。
2.4 实操练习2
-
以记事本的方式打开
1班成绩单.CSV
文件 -
在第二行输入原样输入
刘一,,60
注意这里要输入两个英文逗号,不能输入中文逗号。

-
关闭保存文件。
-
右键点击
1班成绩单.CSV
文件,打开方式选择【Excel】
我们发现刘一
和60
之间多了一个空格。

CSV文件中,如果有多个英文逗号,
第一个逗号的作用是对值进行分隔。
剩下的逗号表示空单元格。
一个逗号表示一个空单元格。
2.5 实操练习3
-
新建一个【Excel】表格
-
点击打开
-
在A1单元格中输入
姓名
,在B1单元格中输入成绩
。 -
点击【文件】-【另存为】
-
【文件类型(T)】中选择【CSV(逗号分隔)】

-
【文件名(N)】中输入 2班成绩单
这样我们就新建了一个CSV文件。
通过以上的练习,我们应该了解了CSV文件的手动操作。
下面我们来学习代码操作CSV文件。
3. os模块文件操作
我们首先用os模块来创建所需的文件夹和删除刚才新建的CSV文件。
3.1 准备工作
-
用VScode编辑器打开
75
文件夹。 -
在
75
文件夹里新建一个75.py
文件。 -
大家在
75.py
文件里编写代码。
3.2 os模块知识回顾
os 是 operation system 的缩写。
operation [ˌɒpəˈreɪʃn]:操作。
system [ˈsɪstəm]:系统。
os 模块支持文件和目录操作,进程管理,环境变量管理等功能。
调用模块下的函数语法:模块名.函数名()
:
3.3 模块导入语法
os 是内置模块,import导入即可使用。
【语法】
import
+ 模块名
import [ˈɪmpɔːt]:导入。
【示例】
import os
3.4 os.getcwd()获取当前工作目录
cwd
是 current working Directory 的缩写,译为当前工作目录。
当前工作目录就是我们现在编写代码的文件所在的文件夹。
# 导入os模块
import os
# getcwd作用是获取当前工作目录
os.getcwd( )
【终端输出】
'd:\\75'
终端输出的'd:\\75'
就是我当前的工作目录,即D盘下的75
文件夹。
3.5 os.remove()删除指定文件
remove[rɪˈmuːv]:去掉、废除。
我们用os.remove()
将刚在在75
文件夹里新建的2个csv文件和1个xlsx文件删除。
【删除前】
import os
# 调用模块的函数
# 模块名.函数名
# remove 的作用是删除指定文件
os.remove("1班成绩单.csv")
os.remove("2班成绩单.csv")
os.remove(r"D:\75\新建 XLSX 工作表.xlsx")
运行代码后,大家看你VScode编辑器左侧的资源管理器里只有一个75.py
文件了。
【语法解析】
os.remove("1班成绩单.csv")
os.remove("2班成绩单.csv")
这里remove括号中的参数为要删除文件的相对路径。
os.remove(r"D:\75\新建 XLSX 工作表.xlsx")
这里remove括号中的参数为要删除文件的绝对路径。
我这里写2种路径是为回顾路径的相关知识点,实操中大家结合自己的需要自行选择。
路径前的r
表示路径转义,加了这个r
就可以不用考虑路径参数中的转义字符。
【VScode查看路径的方法】
-
点击VScode左上角的【资源管理器】
-
右键点击【一班成绩单.csv】
-
选择【复制路径】或【复制相对路径】,然后粘贴就能快速得到文件的路径。

3.6 os.mkdir()新建目录
mkdir
是 make directory 的缩写,译为创建目录。
mkdir 的作用就相当于新建文件夹。
【目标任务】
在当前文件夹下用相对路径新建一个【各班级成绩】文件夹。
在当前文件夹下用绝对路径新建一个【会员表】文件夹。
import os
# 调用模块的函数
# 模块名.函数名
# mkdir作用是创建目录
# 相对路径
os.mkdir("各班级成绩")
# 绝对路径
os.mkdir(r"D:\75\会员表")
运行上述代码后,大家看左侧的资源管理器里多了2个文件夹。
一个是【各班级成绩】文件夹。
os.mkdir("各班级成绩")
mkdir的参数为文件夹名称,表示在当前文件夹下创建目录。
os.mkdir(r"D:\75\会员表")
mkdir的参数为绝对路径,表示在D盘下的75文件夹下创建一个名为【会员表】的目录。
4. CSV文件的写入
【体验代码】
# 导入 csv 模块
import csv
# 用字典存储要写入CSV文件的信息
dict1 = {'姓名': '刘一', '成绩': '100'}
dict2 = {'姓名': '陈二', '成绩': '90'}
# 设置文件的表头,即列名
header = ['姓名', '成绩']
# 文件的相对路径
file_path = r'各班级成绩\1班成绩单.csv'
# 以自动关闭文件的方式创建文件对象
with open(file_path, 'w', encoding='utf-8', newline="") as f:
# 实例化类 DictWriter(),得到 DictWriter 对象
dw = csv.DictWriter(f, fieldnames=header)
# 写入文件的表头
dw .writeheader()
# 写入内容,每次写入一行
dw.writerow(dict1)
dw.writerow(dict2)
【终端显示】

运行上述的代码后,我们在【各班级成绩】文件夹下新建了一个【1班成绩单.csv】文件。
并把字典的内容成功写入了CSV文件。
字典的键姓名
,成绩
就是CSV文件的列名
。
字典的值100
,90
是CSV文件每列相对应的值。
我们只需要10行代码就能完成文件的创建和值的写入。
下面我们来拆解这10行代码。
5. CSV模块知识
csv模块是Python的内置模块,不需要安装,import导入就能直接使用。
【导入语法】
import csv
我们在71节《库与模块》中学过一个.py
文件就是一个模块。
我们在第73节《python第三方库安装教程》也讲到过安装完Python后电脑会有有一个文件夹用来存放模块的源代码。
下面是我电脑csv.py存储的路径。
C:\Users\XXXX\AppData\Local\Programs\Python\Python39\Lib
【CSV模块的部分源代码】
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
def __iter__(self):
return self
@property
def fieldnames(self):
if self._fieldnames is None:
try:
self._fieldnames = next(self.reader)
except StopIteration:
pass
self.line_num = self.reader.line_num
return self._fieldnames
@fieldnames.setter
def fieldnames(self, value):
self._fieldnames = value
def __next__(self):
if self.line_num == 0:
# Used only for its side effect.
self.fieldnames
row = next(self.reader)
self.line_num = self.reader.line_num
# unlike the basic reader, we prefer not to return blanks,
# because we will typically wind up with a dict full of None
# values
while row == []:
row = next(self.reader)
d = dict(zip(self.fieldnames, row))
lf = len(self.fieldnames)
lr = len(row)
if lf < lr:
d[self.restkey] = row[lf:]
elif lf > lr:
for key in self.fieldnames[lr:]:
d[key] = self.restval
return d
class DictWriter:
def __init__(self, f, fieldnames, restval="", extrasaction="raise",
dialect="excel", *args, **kwds):
self.fieldnames = fieldnames # list of keys for the dict
self.restval = restval # for writing short dicts
if extrasaction.lower() not in ("raise", "ignore"):
raise ValueError("extrasaction (%s) must be 'raise' or 'ignore'"
% extrasaction)
self.extrasaction = extrasaction
self.writer = writer(f, dialect, *args, **kwds)
def writeheader(self):
header = dict(zip(self.fieldnames, self.fieldnames))
return self.writerow(header)
def _dict_to_list(self, rowdict):
if self.extrasaction == "raise":
wrong_fields = rowdict.keys() - self.fieldnames
if wrong_fields:
raise ValueError("dict contains fields not in fieldnames: "
+ ", ".join([repr(x) for x in wrong_fields]))
return (rowdict.get(key, self.restval) for key in self.fieldnames)
def writerow(self, rowdict):
return self.writer.writerow(self._dict_to_list(rowdict))
def writerows(self, rowdicts):
return self.writer.writerows(map(self._dict_to_list, rowdicts))
上面的代码是我从Python的csv.py
模块的源代码中复制出来的部分代码。
这里的展示源代码的目的:
一是为了让大家更深入的理解什么是模块。
二是为了让大家更直观的感受CSV模块的的类与方法。
知其然并知其所以然,这样就不存在记忆代码这种说法。
【CSV的类】
class DictReader:
class DictWriter:
class关键字,首字母D大写我们能很准确的确定这是2个类名。
dictionary [ˈdɪkʃənri]:字典。
reader [ˈriːdə]:读者。
writer [ˈraɪtə]:写手。
DictReader:用字典的形式读取。
DictWriter:以字典的形式写入。
这2个类的作用顾名思义就是读取和写入。
【CSV的函数】
def writeheader(self):
def writerow(self, rowdict):
def writerows(self, rowdicts):
以def开头的即是自定义函数。
在类中定义的函数我们称为方法。
上述3行代码就是在DictWriter类中定义的3个方法。
header [ˈhedə(r)]:头。
row [rəʊ]:行。
writeheader:写入头(这里的头指表格的表头,即列名)。
writerow:写入一行,
writerows:写入多行。
上述内容是我个人的理解,仅供大家参考。
【调用模块或库中的类、函数、变量】
-
调用模块或库的类:
模块名.类名()
,如 csv.DictReader() -
调用模块或库的函数:
模块名.函数名()
,如 csv.writerow
6.语法解析
6.1 导入模块
# 导入 csv 模块
import csv
处理CSV文件需要用csv模块。
6.2 新建字典
# 用字典存储要写入CSV文件的信息
dict1 = {'姓名': '刘一', '成绩': '100'}
dict2 = {'姓名': '陈二', '成绩': '90'}
字典是一种数据类型。
字典用英文大括号{}
表示;
字典的键和值之间用英文冒号:
分隔;
键值对之间英文逗号,
分隔;
字典的键是就是文件的列名,也就是表头的意思。
这里的键是姓名
和成绩
。
字典的值就是每列对应的值。
姓名对应的值是刘一
和陈二
。
成绩对应的值是100
和90
。
作者:安迪的python学习笔记 xyz77520520
6.3 确定表头
# 设置文件的表头,即列名
header = ['姓名', '成绩']
header [ˈhedə(r)]:头。
header是变量名,它存储的是一个列表。
列表里的元素就是要写入的表头。

注意这个表头就是字典的键。
表头和字典的键要一一对应起来,否则程序会找不到要写入的值。
6.4 确定文件的路径
确定文件名:1班成绩单.csv。
这里我是要写到csv文件里,那文件扩展名就用.csv。
1班成绩单是我给文件起的名字。
我要在【75】文件夹里的【各班级成绩】文件夹里新建文件,该文件的路径应该写为:
【相对路径】
# 文件的相对路径
file_path = r'各班级成绩\1班成绩单.csv'
如果你的编辑器打开的不是【75】文件,则相对路径就不是上面这个。
【绝对路径】
# 设置文件路径
file_path = r'D:\75\各班级成绩\1班成绩单.csv'
字母r
起到路径转义的作用,有了r
可以不用考虑路径参数里的转义字符。
6.5 创建文件对象
日常工作中我们要往一个文件里写入内容,我们首先要创建一个文件,才能写入。
Python也是一样,我们要写入东西,往哪里写呢?我们首先得有一个对象,对吧?
因此我们需要创建一个文件对象。
Python一切皆对象就是这个意思。
我们在第69节《open函数—打开文件并返回文件对象》和第70节《with open( ) as 以自动关闭文件的方式打开文件》中学过,open语句和with open 语句都能创建一个文件对象。
# 以自动关闭文件的方式创建文件对象
with open(file_path, 'w', encoding='utf-8', newline="") as f:
with open as f :
和 open
语句的参数是一样的,区别是 with open
语句可以自动关闭文件。
【open语句的参数】
open(file, mode='', encoding='utf-8', newline="", errors='None')
-
参数 file 表示要打开文件的路径。
路径我们已经确定好了,就是上面的file_path变量。
-
参数 mode 决定了打开文件的模式。

这里我们需要要写入内容,我们可以选择w
模式。
w
模式在文件不存在的情况下,可以直接创建文件。
-
参数 encoding 表示文件的编码方式,文件编码方式一般为
encoding='utf-8'
。 -
参数
newline
表示用于区分换行符,只对文本模式有效,可以取的值有None
,\n
,\r
。
newline [n'ju:laɪn]:换行。
说人话意思就是如果你在open函数中增加了参数newline=""
,那写入的内容是没有空行的。
如果没有这个参数,那写入的内容是有空行的(后面做演示)。
-
errors参数大家不用理会。
【f是文件对象】
as f中的f
指的是文件对象。
等同于你在电脑上新建的一个文件,只是这个文件是实物,是肉眼可见的。
f
是一个变量名,你可以随意命名。
这个f就是一个我们肉眼看不见的文件对象,我们就是要向这个对象里写入内容。
Python一切皆对象,操作文件要有文件对象,就是这个意思哈。
6.6 实例化类创建对象
我们之前讲过,类的作用是创建对象。
对象创建的语法如下:
对象名=类名()
# 实例化类 DictWriter(),得到 DictWriter 对象
dw = csv.DictWriter(f, fieldnames=header)
print(type(dw))
dw是对象名,你可随意起名。
csv是模块名。
这里我们调用的是模块里的类,因此语法为模块名.类名
DictWriter是类名,作用是用字典的形式写入。
括号的第1个参数是文件对象,
括号的第2个参数是字段名称,我们可以理解成表头或列名。
我们将确定好的表头,即变量header赋值给参数fieldnames。
fieldnames=header
field[fiːld]:字段。
fieldnames 字段名称
我多加了下面这行代码:
print(type(dw))
加入这行代码后,程序会输出dw
的数据类型。
【终端输出】
<class 'csv.DictWriter'>
观看输出,大家就能明白dw
就是类实例化后创建的DictWriter
对象。
6.7 写入内容
文件对象创建成功后,又实例化了一个可以用字典写入的对象。
下面我们就往这个对象里写入内容。
写入内容那我们就需要用调用类的方法了。
作者:安迪的python学习笔记 xyz77520520
【调用类的方法】
对象名.方法名(值,...)
# 写入文件的表头
dw.writeheader()
# 写入文件的单行内容
dw.writerow(dict1)
dw.writerow(dict2)
dw
是我给类实例化后创建的对象起的名字。
writeheader
是类的方法名,作用是写入表头。
表头在实例化的时候已经赋值给参数fieldnames
,因此这里的参数为空。
writerow
类的方法名,作用是写入行,即一次写入一行。
dict1
和dict2
是要写入的值。
newline参数和writerows下节再讲。
7. 代码总结
# 导入os 模块,用于创建文件目录
import os
# 导入 csv 模块,用于操作CSV文件
import csv
# mkdir作用是创建目录
# 相对路径
os.mkdir("各班级成绩2")
# 用字典存储要写入CSV文件的信息
dict1 = {'姓名': '刘一', '成绩': '100'}
dict2 = {'姓名': '陈二', '成绩': '90'}
# 设置文件的表头,即列名
header = ['姓名', '成绩']
# 文件的相对路径
file_path = r'各班级成绩2\1班成绩单.csv'
# 以自动关闭文件的方式创建文件对象
with open(file_path, 'w', encoding='utf-8', newline="") as f:
# 实例化类 DictWriter(),得到 DictWriter 对象
dw = csv.DictWriter(f, fieldnames=header)
# 写入文件的表头
dw .writeheader()
# 写入内容,每次写入一行
dw.writerow(dict1)
dw.writerow(dict2)
【备注】
这一节构思了许久,看着好像没什么大工程,但我总共花了差不多7个小时。
如果笔记对你有帮助,请帮忙点个在看或分享给其他小伙伴。
你的分享是我持续创作的动力哦!!!感恩你的喜欢!!!
因为有文章被不知名转载,文中加入了作者。
作者介绍