1、前言
1.1、CSV简介
CSV的英文全称为:Comma-Separated Values,翻译过来就是:用逗号分隔的值。时至今日,CSV已经不限于仅仅支持以逗号去分隔数据。那么CSV文件中的数据都是以什么样的方式存储的呢:
- csv文件以纯文本的形式去存储表格数据。
- csv文件由任意数目的记录组成,通常,所有记录都有完全相同的字段序列。记录之间以某种换行符分隔,如:’\n’。
- csv中的每条记录由多个字段组成,每个字段之间以某种分隔符分隔,常见如:, 、| 、制表符。
CSV文件为纯文本文件,建议使用记事本来开启,其中使用逗号分隔每条记录中的字段:
或者,也可以另存新档后用Excel开启:
python三方库提供了csv库,我们需要通过这个库,来实现对CSV文件的读与写。所以我们在应用csv库之前,需要提前安装它。
# win:
pip install csv
# mac
pip3 install csv
# 若提示下载超时,则用以下的方式安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple csv
注意,本文的案例因为大多都是案例片段,最终显示的代码都没有关闭文档对象,在实际的运用中切记要关闭,或者使用with open as
的方式打开。
1.2、CSV文件读写方式分类
csv库提供了两种读写csv文件的方式:以列表为单位读写csv文件、以字典为单位读写csv文件。
- 以列表为单位读写csv文件:csv文件中的每条记录以列表为单位呈现或操作。
- 以字典为单位读写csv文件:csv文件中的每条记录以字典为单位呈现或操作。
2、以列表为单位读写CSV文件
在1.1简介中,我们打开csv文件后发现,csv文件的数据中的每行数据都有这相同的字段序列,分别以姓名,语文,数学,英语
的顺序排列组成每条记录。python中,我们可以用列表模拟csv文件中的每条数据关系。列表的有序性,可以很方便的表达或存储csv文件中的每条记录。我们可以通过列表的这个特性,去完成对csv文件的读写操作。
2.1、以列表为单位读取CSV文件(reader)
2.1.1、生成CSV文件读取对象
csv模块下提供了reader方法,用于生成一个可以方便用户读取csv文件的对象。我们先来看看这个接口的定义:
def reader(iterable, dialect='excel', *args, **kwargs):
"""
...
The "iterable" argument can be any object that returns a line
of input for each iteration, such as a file object or a list.
...
"""
我们从该接口对iterable参数的描述可知:
参数 | 类型 | 说明 |
---|---|---|
iterable | 可迭代对象(如列表)、文件对象 | 该参数可以赋一个可迭代对象,也可以赋一个文件对象。 |
我们需要操作csv文件,所以显然此处我们需要给iterable参数传递一个文件对象。即我们平时用到的open打开的文件。首先open中的参数newline必须赋值为’’,即newline=’’;其次,若编码集参数encoding期望值为utf-8,最好写成utf-8-sig,即encoding=‘utf-8-sig’。这样可以避免第一个获取到的值存在一段未解码的字符串;最后,既然是读取类,我们在使用open打开csv文件的时候当然需要以“读”的方式去打开。比如我们需要打开一个测试数据.csv
,并生成一个csv读对象
csv_file = open('./测试数据.csv', 'r', encoding='utf-8-sig', newline='')
csv_reader = csv.reader(csv_file)
2.1.2、读取CSV文件
获取到csv读取对象后,我们就可以通过csv读取对象读取csv文件中的内容,csv文件读取对象是一个可遍历的对象,我们可以通过for循环遍历的方式,去获取csv文件中的数据:
for row in csv_reader:
print(type(row)) # <class 'list'>
print(row) # ['姓名', '语文', '数学', '英语'] ...
可以看到,每轮遍历都会获取一个列表,该列表中的元素就是遍历行的各个字段值。
2.2、以列表为单位写入CSV文件(writer)
2.2.1、生成CSV文件写入对象
csv模块下提供了writer
方法,用于生成一个可以写入csv文件的对象。我们先来看看这个接口的定义:
def writer(fileobj, dialect='excel', *args, **kwargs):
"""
...
The "fileobj" argument can be any object that supports the file API.
...
"""
在此处,fileobj对象似乎跟读文件限制不同,但是我们需要将数据写入csv文件中,所以此处fileobj还是一个以“写”的方式打开的文件。生成csv文件写入对象的方法如下:
csv_file = open('./测试数据.csv', 'w', encoding='utf-8-sig', newline='')
csv_writer = csv.writer(csv_file)
2.2.2、写入CSV文件
csv文件写入对象提供了单条记录写入(writerow)与多条记录同时写入(writerows)的方法,大大的便捷了我们去写入csv文件。(我的python环境为3.9)
class _writer:
dialect: Dialect
if sys.version_info >= (3, 5):
def writerow