一、csv文件介绍

CSV 文件(Comma-Separated Values,逗号分隔值文件)是一种以纯文本格式存储表格数据的文件类型。它通常用于在不同的应用程序或系统之间交换数据,尤其是电子表格或数据库中的数据。CSV 文件的特点:

  1. 纯文本格式:CSV 文件是纯文本文件,可以用任何文本编辑器打开和查看。
  2. 表格结构:CSV 文件表示一张表格,每一行是一条记录,每条记录包含一个或多个字段(数据列)。
  3. 分隔符:字段之间通常用 逗号(,) 分隔,虽然也有可能用其他符号(如制表符、分号)作为分隔符。
  4. 简单结构:没有嵌套的结构,也没有数据类型的定义,所有内容都是以字符串的形式存储。
  5. 兼容性强:几乎所有的数据库、电子表格软件(如 Excel、Google Sheets)和编程语言都支持 CSV 格式,方便数据导入和导出。

CSV 文件的每一行代表一条记录,记录中的每个字段由逗号分隔。通常,第一行包含字段名(标题),接下来的每一行是对应字段的数据。示例 CSV 文件:

id,name,age,address,sex
1,amo,18,cq,male
2,paul,25,cq,male
3,crystal,19,cd,female

常见的 CSV 文件使用场景:

  1. 数据交换:在不同系统之间传递数据,CSV 格式简单、轻量,易于解析。
  2. 导入导出数据:软件(如 Excel、数据库系统、数据分析工具)通常提供将数据保存为 CSV 文件,或从 CSV 文件中导入数据。
  3. 数据备份:CSV 文件可以作为数据备份文件,存储简单的表格结构数据。

CSV 文件的局限性:

  1. 没有数据类型:所有数据都作为字符串处理,不能直接区分文本、数字或日期等数据类型。
  2. 缺乏复杂结构:不能直接表示嵌套的数据结构或多维数据。
  3. 数据解析的特殊情况:如果字段中包含逗号、换行符或引号,需要使用引号包裹字段,并对引号进行转义。

处理带有逗号、换行符的字段。 CSV 文件中的字段如果包含特殊字符(如逗号、换行符、引号),通常需要使用引号包裹,并进行转义。例如:

# 情况1:包含逗号的字段
Name,Address
Alice,"123 Main Street, New York, NY"
Bob,"456 Pine Road, Los Angeles, CA"

# 情况2:包含换行符的字段
Name,Comments
Alice,"I love programming.
Python is great!"
Bob,"This is a multiline
comment in CSV."

# 情况3:包含双引号的字段
Name,Quote
Alice,"She said, ""Hello, World!"""
Bob,"Python's motto is ""Batteries included."""

# 情况4:多个复杂情况同时存在
Name,Address,Comments
Alice,"123 Main Street, New York, NY","She said, ""Hello, World!""."
Bob,"456 Pine Road, Los Angeles, CA","This comment spans
multiple lines, and contains a comma, as well as a ""quote""."

小结: CSV 文件是一种简单、通用的文件格式,用于存储和交换表格数据。它以逗号(或其他分隔符)分隔字段,兼容性强且易于使用,但不适合处理复杂或嵌套的数据结构。

二、csv模块

2.1 csv模块介绍

csv 模块的产生要从 csv 文件说起:csv 文件其实就是一个文本文件,用逗号分隔其值。因此,在 Python 中可以使用 split() 方法读取其中的值。如果 csv 文件中的文本数据中包含逗号,那么 csv 文件会进行转义,但是 split() 方法却不能处理这些转义字符,另外还有一些其他方面的问题。这种情况下就产生了 csv 模块,通过该模块来读写 csv 文件,解决 Python 读写 csv 文件时所遇到的一些麻烦。csv 模块是实现以 CSV 格式读取和写入表格数据的类。它可以定制其他应用程序适用的 CSV 格式或定义自己的专用 CSV 格式,还包括一些类和方法等,其中 reader 类和 writer 类用于读写序列化的数据,而 DictReader 类和 DictWriter 类将以字典的形式读写数据。

2.2 csv 模块的基本功能

csv 模块允许你以简单的方式进行 CSV 文件的读写操作,支持不同的分隔符、引用风格等。下面是 csv 模块的常见功能:

  1. 读取 CSV 文件:通过 csv.reader() 函数来逐行读取 CSV 文件中的数据。
  2. 写入 CSV 文件:通过 csv.writer() 函数向 CSV 文件中写入数据。
  3. DictReader 和 DictWriter:可以将每一行数据映射为 Python 字典进行处理。

2.3 reader()方法——读取csv文件

reader() 方法用于读取 csv 文件。语法格式如下:

In [2]: csv.reader?
Docstring:
csv_reader = reader(iterable [, dialect='excel']
                        [optional keyword args])
    for row in csv_reader:
        process(row)

The "iterable" argument can be any object that returns a line
of input for each iteration, such as a file object or a list.  The
optional "dialect" parameter is discussed below.  The function
also accepts optional keyword arguments which override settings
provided by the dialect.

The returned object is an iterator.  Each iteration returns a row
of the CSV file (which can span multiple input lines).
Type:      builtin_function_or_method

参数说明:
1.iterable: 必须是支持迭代器的reader 对象,可以是文件(file 对象)。
2.dialect: 表示csv文件的编码风格,默认为excel方式,也就是用逗号","分隔。
dialect也支持自定义,通过调用 register_dialect() 方法注册新的编码风格。
3.[optional keyword args]: 格式参数
4.返回值: 返回一个reader对象,该对象将迭代遍历给定的csv文件中的行。

【示例1】简单读取csv文件。使用reader()方法简单读取csv文件,并传入一个文件对象。由于reader()方法返回的是一个可迭代的对象,因此需要使用for循环实现遍历,代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2024-09-13 19:13
# @Author  : AmoXiang
# @File: csv_demo.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680

import csv

# 1.简单读取csv文件
with open('./tmp/test.csv', 'r') as file:  # 打开csv文件
    reader = csv.reader(file)  # 读取csv文件
    for row in reader:
        print(row)

程序运行结果如下:
在这里插入图片描述
【示例2】提取某列数据。如果想要提取csv文件中某列数据,则需要指定上下标。例如,查看“name”列数据,那么只需要改为row[1],具体代码如下:

# 2.提取某列数据: 如name这一列
with open('./tmp/test.csv', 'r') as file:
    reader = csv.reader(file)
    for row in reader:
        print(row[1])

程序运行结果如下:
在这里插入图片描述
【示例3】提取某行数据。提取csv文件某行数据,需要在循环语句中使用enumerate()函数将读取后的csv文件数据组合为一个索引序列,这个序列中包含了数据和数据下标,当下标为指定行时,提取该行数据。例如,获取第三行数据,代码如下:

with open('./tmp/test.csv', 'r') as file:
    reader = csv.reader(file)
    for idx, v in enumerate(reader):
        if idx == 2:
            print(v)  # ['2', 'paul', '25', 'cq', 'male']

【示例4】查看csv文件指定行列数据。查看特定行和列的数据,需要将reader()方法返回的reader对象转换成Python列表,然后指定列表的上下标来读取特定行和列的数据,如读取第2行第2列的数据,代码如下:

with open('./tmp/test.csv', 'r') as file:
    reader = csv.reader(file)  # 创建reader对象
    lis_rows = list(reader)
    print(lis_rows[1][1])  # amo

【示例5】读取csv文件表头的两种方法。

with open('./tmp/test.csv', 'r') as file:
    rows = [row for row in csv.reader(file)]
    print(rows)
    print(rows[0])  # ['id', 'name', 'age', 'address', 'sex']

with open('./tmp/test.csv', 'r') as file:
    # 创建reader对象
    reader = csv.reader(file)
    # 读取第1行数据
    h1 = next(reader)
    print(h1)  # ['id', 'name', 'age', 'address', 'sex']

【示例6】获取csv文件某列的最大值。首先使用reader()方法读取数据,然后将要计算最大值的列(如“年龄”)保存为列表,之后再使用max()函数求该列最大值,代码如下:

with open('./tmp/test.csv', 'r') as file:
    reader = csv.reader(file)
    # res = []
    # for idx, row in enumerate(reader):
    #     if idx == 0:
    #         continue
    #     else:
    #         res.append(int(row[2]))
    # print(max(res))
    print(max(map(int, [row[2] for idx, row in enumerate(reader) if idx])))

【示例7】将csv文件转换成dataframe格式。使用reader()方法读取csv文件数据,然后将其转换成dataframe格式,代码如下:

import csv
import pandas as pd

# 解决输出dataframe格式数据不对齐,显示不全的问题
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)
# 读取csv文件数据
lines = list(csv.reader(open(r'./tmp/test.csv')))
header, values = lines[0], lines[1:]
data1 = {h: v for h, v in zip(header, zip(*values))}
df = pd.DataFrame(data1)  # 转换成dataframe格式
print(df)

程序运行结果如下:
在这里插入图片描述

2.4 writer()方法——将数据写入csv文件

writer() 方法用于将数据写入 csv 文件。语法格式如下:

In [2]: csv.writer?
Docstring:
csv_writer = csv.writer(fileobj [, dialect='excel']
                            [optional keyword args])
    for row in sequence:
        csv_writer.writerow(row)

    [or]

    csv_writer = csv.writer(fileobj [, dialect='excel']
                            [optional keyword args])
    csv_writer.writerows(rows)

The "fileobj" argument can be any object that supports the file API.
Type:      builtin_function_or_method


参数说明: 
1.fileobj: 必须是支持迭代器的writer对象,可以是文件(file 对象)。
2.dialect: csv文件的编码风格,默认为excel编码风格,也就是用逗号","分隔
csv文件的编码风格也支持自定义,通过调用register_dialect()方法注册新的编码风格
3.[optional keyword args]: 格式参数
4.返回值: 返回一个writer对象。

writer 对象的 writerow() 方法用于写一行数据到 csv 文件中。语法格式如下:

In [5]: csv_writer.writerow?
Docstring:
writerow(iterable)

Construct and write a CSV record from an iterable of fields.  Non-string
elements will be converted to string.
Type:      builtin_function_or_method
参数说明:
1.iterable: 可迭代对象,如列表、元组等。
2.返回值: 无。

writer 对象的 writerows() 方法用于将行中的所有元素(行对象的可迭代数据)写入到 csv 文件。语法格式如下:

In [6]: csv_writer.writerows?
Docstring:
writerows(iterable of iterables)

Construct and write a series of iterables to a csv file.  Non-string
elements will be converted to string.
Type:      builtin_function_or_method
参数说明:
1.iterable of iterables: 表示可迭代数据
2.返回值:

【示例1】简单写入一行数据到csv文件。使用writerow()方法向csv文件写入一行数据,代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2024-09-14 3:09
# @Author  : AmoXiang
# @File: csv_writer_demo.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680

import csv

with open('./tmp/csv_test1.csv', 'w', newline='', encoding='utf8') as f:  # 如不指定newline='',会写入空行
    writer = csv.writer(f)
    writer.writerow(['订单编号', '会员名', '商品名称'])  # 写入一行标题

【示例2】使用writerow()方法写入多行数据。writerow() 方法不仅可以写入单行数据,数据较少的情况下也可以写入多行。例如,写入3行学生数据,代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2024-09-14 3:09
# @Author  : AmoXiang
# @File: csv_writer_demo.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680


import csv

with open('./tmp/csv_test1.csv', 'w', newline='', encoding='utf') as file:
    writer = csv.writer(file)
    writer.writerow(['id', 'name', 'age'])
    writer.writerow(['001', 'amo', 18])
    writer.writerow(['002', 'jerry', 35])
    writer.writerow(['003', 'paul', 25])

【示例3】批量随机生成学生信息并写入csv 文件。通过循环语句结合随机函数批量生成学生信息,如ID、学号和班级,然后循环写入csv文件,代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2024-09-14 3:09
# @Author  : AmoXiang
# @File: csv_writer_demo.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680


import csv
import random

with open('./tmp/stu.csv', 'w', newline='', encoding='utf8') as file:
    writer = csv.writer(file)
    writer.writerow(['ID', '学号', '班级'])
    for i in range(9):
        num = random.randint(20190000, 20199999)  # 随机生成"学号"
        writer.writerow([i + 1, num, '高一十二班'])  # 写入学生数据

【示例4】将多行数据写入csv 文件。首先打开一个csv文件,通过writerow()方法写入csv文件的表头,然后使用writerows()方法写入多行数据到csv文件中,代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2024-09-14 3:09
# @Author  : AmoXiang
# @File: csv_writer_demo.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680


import csv

data = [
    ['Name', 'Age', 'City'],
    ['Alice', 30, 'New York'],
    ['Bob', 25, 'Los Angeles'],
    ['Charlie', 35, 'Chicago']
]

# 打开一个 CSV 文件进行写入
with open('./tmp/output.csv', mode='w', newline='', encoding='utf8') as file:
    writer = csv.writer(file)
    # 写入多行数据
    writer.writerows(data)

2.5 DictWriter类——创建支持字典的csv文件

DictWriter 类用于创建一个支持字典类型的 csv 文件。语法格式如下:

In [11]: csv.DictWriter?
Init signature:
csv.DictWriter(
    f,
    fieldnames,
    restval='',
    extrasaction='raise',
    dialect='excel',
    *args,
    **kwds,
)
Docstring:      <no docstring>
File:           f:\dev_tools\python\python310\lib\csv.py
Type:           type
Subclasses:

参数说明: 
1.f: 表示文件对象。
2.fieldnames: 表示字段名称,该参数不是可选的。
3.restval: 如果csv文件中缺少指定的字段名,则使用可选参数restval指定要写入的值。
4.extrasaction: 如果传递给方法的字典包含字段名中找不到的键,则使用可选参数extrasaction指定要采取的操作。
5.dialect: 支持excel格式的csv编码风格。
6.*args: 不定数量的非键值对参数(格式参数)。
7.**kwds: 不定数量的键值对参数(格式参数)。
8.返回值: 返回csv文件。

示例:

# -*- coding: utf-8 -*-
# @Time    : 2024-09-14 3:09
# @Author  : AmoXiang
# @File: csv_writer_demo.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680

import csv

data = [
    {'Name': 'Alice', 'Age': 30, 'City': 'New York'},
    {'Name': 'Bob', 'Age': 25, 'City': 'Los Angeles'},
    {'Name': 'Charlie', 'Age': 35, 'City': 'Chicago'},
    {'Name': 'Amo', 'Age': 18, 'City': 'CQ'}
]

# 打开 CSV 文件进行写入
with open('./tmp/output.csv', mode='w', newline='', encoding='utf8') as file:
    # 指定字段名
    fieldnames = ['Name', 'Age', 'City']
    # 创建 DictWriter 对象
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    # 写入标题行
    # DictWriter类的writeheader方法用于将字段名称作为一行数据写入csv文件中
    writer.writeheader()
    # 写入多行数据
    writer.writerows(data[:-1])
    # 写入单行数据
    writer.writerow(data[-1])

2.6 DictReader类——创建字典类型的csv文件对象

DictReader 类用于为读取的 csv 文件创建一个有序字典的可读取的 csv 文件对象。语法格式如下:

In [12]: csv.DictReader?
Init signature:
csv.DictReader(
    f,
    fieldnames=None,
    restkey=None,
    restval=None,
    dialect='excel',
    *args,
    **kwds,
)
Docstring:      <no docstring>
File:           f:\dev_tools\python\python310\lib\csv.py
Type:           type
Subclasses:

参数说明: 
1.f: 文件对象。
2.fieldnames: 字段名称。如果省略fieldnames参数,则文件f的第一行中的值将作为字段名。
3.restkey: 如果一行包含的字段多于字段名,则将剩余的数据存放在一个列表中,
并使用restkey参数指定的字段名(默认为None)进行存储。如果非空行的字段少于字段名,则缺少的值将填入None4.restval: 如果csv文件缺少指定的字段名,则使用可选参数restval指定要写入的值。
5.dialect: 支持excel格式的csv编码风格。
6.*args: 不定数量的非键值对参数(格式参数)。
7.**kwds: 不定数量的键值对参数(格式参数)。
8.返回值: 返回csv文件对象。

示例:

import csv

# 打开 CSV 文件
with open('./tmp/stu.csv', mode='r', newline='', encoding='utf8') as file:
    reader = csv.DictReader(file)

    # 逐行读取数据,返回字典
    for row in reader:
        row: dict = row
        print(row, row.get('ID'), row.get('学号'), row.get('班级'))  # 每行是一个字典

完整示例:

# -*- coding: utf-8 -*-
# @Time    : 2024-09-14 6:49
# @Author  : AmoXiang
# @File: csv_demo.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680

import csv

# 数据
data = [
    {'Name': 'Alice', 'Age': 30, 'City': 'New York'},
    {'Name': 'Bob', 'Age': 25, 'City': 'Los Angeles'},
    {'Name': 'Charlie', 'Age': 35, 'City': 'Chicago'}
]

# 写入 CSV 文件
with open('./tmp/ts.csv', mode='w', newline='', encoding='utf8') as file:
    fieldnames = ['Name', 'Age', 'City']
    """
    ① delimiter: 定义字段之间的分隔符,默认为 ,
    ② quotechar: 定义引用符,默认为 "
    ③ quoting: 控制何时使用引用符,可选值包括
        csv.QUOTE_MINIMAL(默认): 只有当字段中包含特殊字符时(如分隔符、换行符或引用符)才使用引用符。
        csv.QUOTE_ALL: 为所有字段加上引用符。
        csv.QUOTE_NONNUMERIC: 为所有非数字字段加上引用符。
        csv.QUOTE_NONE: 不使用引用符。
    """
    writer = csv.DictWriter(file, fieldnames=fieldnames, delimiter=';', quotechar='"',
                            quoting=csv.QUOTE_ALL)
    # 写入标题
    writer.writeheader()
    # 写入数据
    writer.writerows(data)

# 读取 CSV 文件
with open('./tmp/ts.csv', mode='r', newline='', encoding='utf8') as file:
    reader = csv.DictReader(file, delimiter=';', quotechar='"')
    for row in reader:
        print(row)

2.7 几个常用属性说明

2.7.1 QUOTE_ALL常量——对所有字段加引用符

使用 writer 对象写入数据时,当 quoting 参数设置为 QUOTE_ALL 常量时,表示对所有字段加入引用符。语法格式如下:

csv.QUOTE_ALL

示例:

import csv

with open('./tmp/a1.csv', 'w', newline='', encoding='utf8') as csvfile:
    writer = csv.writer(csvfile, delimiter=' ', quotechar='|', quoting=csv.QUOTE_ALL)
    writer.writerow(['amo'] * 5 + ['www.baidu.com'])
    writer.writerow(['amo', 4006751066, 84978981])

"""
|amo| |amo| |amo| |amo| |amo| |www.baidu.com|
|amo| |4006751066| |84978981|
"""

2.7.2 QUOTE_MINIMAL常量——只对包含特殊字符的字段加引用符

使用 writer 对象写入数据时,当 quoting 参数设置为 QUOTE_MINIMAL 常量时,表示只对包含特殊字符的字段加入引用符。语法格式如下:

csv.QUOTE_MINIMAL

示例:

import csv

with open('./tmp/a2.csv', 'w', newline='', encoding='utf8') as csvfile:
    writer = csv.writer(csvfile, delimiter=' ',
                        quotechar='|', quoting=csv.QUOTE_MINIMAL)
    writer.writerow(['amo'] * 5 + ['www.baidu.com'])
    writer.writerow(['am o', 4006751066, 84978981])

'''
amo amo amo amo amo www.baidu.com
|am o| 4006751066 84978981
'''

2.7.3 QUOTE_NONE常量——对所有字段不加引用符

QUOTE_NONE 常量是引用字段模式中的一种,用于告诉程序,csv 文件里不加入引用符。例如,csv 文件中的文本数据本身存在逗号,而 csv 文件中又使用逗号作为分隔符,那么文本数据本身存在的逗号也会被当作分隔符,不管它在不在引用符里面。这种情况下可以设置 QUOTE_NONE 常量,对所有字段不加引用符。语法格式如下:

csv.QUOTE_NONE

示例:

import csv

with open('./tmp/a3.csv', 'w', newline='', encoding='utf8') as csvfile:
    writer = csv.writer(csvfile, delimiter=';', quotechar='|', quoting=csv.QUOTE_NONE)
    writer.writerow(['amo'] * 5 + ['www.baidu.com'])
    # writer.writerow(['amo;', 4006751066, 84978981])  # 会报错
    # _csv.Error: need to escape, but no escapechar set
    # 如果设置了csv.QUOTE_NONE,则字段中出现delimiter 需要转义

'''
amo;amo;amo;amo;amo;www.baidu.com
'''

2.7.4 QUOTE_NONNUMERIC常量——对所有非数字的字段加引用符

使用 writer 对象写入数据时,当 quoting 参数设置为 QUOTE_NONNUMERIC 常量时,表示对所有非数字的字段加入引用符。语法格式如下:

csv.QUOTE_NONNUMERIC

示例:

import csv

with open('./tmp/a4.csv', 'w', newline='', encoding='utf8') as csvfile:
    writer = csv.writer(csvfile, delimiter='@', quotechar='|', quoting=csv.QUOTE_NONNUMERIC)
    writer.writerow(['amo'] * 5 + ['https://blog.csdn.net/xw1680?'])
    writer.writerow(['amo', 18, 168])

'''
|amo|@|amo|@|amo|@|amo|@|amo|@|https://blog.csdn.net/xw1680?|
|amo|@18@168
'''

2.7.5 Dialect类——创建包含csv文件基本属性的类

csv 文件中的格式有很多,如逗号分隔、冒号分隔等,我们可以自己定义一个 Dialect 类,在该类中规定格式,以读取或写入 csv 文件。语法格式如下:

In [17]: csv.Dialect?
Init signature: csv.Dialect()
Docstring:
Describe a CSV dialect.

This must be subclassed (see csv.excel).  Valid attributes are:
delimiter, quotechar, escapechar, doublequote, skipinitialspace,
lineterminator, quoting.
File:           f:\dev_tools\python\python310\lib\csv.py
Type:           type
Subclasses:     excel, unix_dialect
参数说明:
1.返回值: 返回Dialect类。

示例:

import csv


class MyDialect(csv.Dialect):
    lineterminator = '\n'
    delimiter = ';'
    quotechar = '|'


with open('./tmp/stu.csv', 'r', encoding='utf8') as f:
    reader = csv.reader(f, dialect=MyDialect, quoting=csv.QUOTE_ALL)
    for row in reader:
        print(row)

'''
['ID,学号,班级']
['1,20195844,高一十二班']
['2,20199172,高一十二班']
['3,20190495,高一十二班']
['4,20199035,高一十二班']
['5,20198153,高一十二班']
['6,20191362,高一十二班']
['7,20193697,高一十二班']
['8,20196357,高一十二班']
['9,20199604,高一十二班']
'''

2.7.6 delimiter属性——用于设置字段之间的分隔符

delimiter 属性用于定义字段之间使用的分隔符,默认为逗号 "," 语法格式如下:

Dialect.delimiter

示例:

import csv

with open('./tmp/a5.csv', 'w', newline='', encoding='utf8') as csvfile:
    writer = csv.writer(csvfile, delimiter='&', quotechar='|', quoting=csv.QUOTE_NONE)
    writer.writerow(['amo'] * 5 + ['www.baidu.com'])
    writer.writerow(['amo', 18, 168])

'''
amo&amo&amo&amo&amo&www.baidu.com
amo&18&168
'''

2.7.7 doublequote属性——是否添加双引用符

doublequote 属性提供了一种解决引用符里出现引用符问题的文件规范,默认值为 True。语法格式如下:

Dialect.doublequote

当 csv 文件数据中存在与引用符相同的符号时,例如,引用符为引号 " 而 csv 文件中的数据也有该符号,那么在该符号的位置将会出现两次引号 " 如果 doublequote 值为 False,且没有指定转义字符(设置 escapechar 参数)的情况下,程序就会出现错误提示。示例:

import csv

with open('./tmp/a6.csv', 'w', newline='', encoding='utf8') as csvfile:
    writer = csv.writer(csvfile, delimiter='&', quotechar='"', doublequote=True)
    # _csv.Error: need to escape, but no escapechar set 下面的代码报错
    # writer = csv.writer(csvfile, delimiter='&', quotechar='"', doublequote=False)
    writer.writerow(['a"mo'] * 5 + ['www.baidu.com'])
    writer.writerow(['amo', 18, 168])

'''
"a""mo"&"a""mo"&"a""mo"&"a""mo"&"a""mo"&www.baidu.com
amo&18&168
'''

2.7.8 escapechar属性——设置转义字符

在向 csv 文件写入或读取数据时,通过设置 escapechar 属性在文本中使用转义字符,默认是 None,不使用转义字符。语法格式如下:

Dialect.escapechar

示例:

import csv

with open('./tmp/a7.csv', 'w', newline='', encoding='utf8') as csvfile:
    # _csv.Error: need to escape, but no escapechar set 下面的代码报错
    # writer = csv.writer(csvfile, delimiter='&', quotechar='"', doublequote=False)
    writer = csv.writer(csvfile, delimiter='&', quotechar='"', doublequote=False, escapechar='%')
    writer.writerow(['am"o'] * 5 + ['www.baidu.com'])
    writer.writerow(['amo', 18, 168])

'''
am%"o&am%"o&am%"o&am%"o&am%"o&www.baidu.com
amo&18&168
'''

2.7.9 lineterminator属性——设置一行结束的结束符

lineterminator 属性用于向 csv 文件写入数据时设置行的结束符,默认为 "\r\n" 读数据操作时将忽略此选项。语法格式如下:

Dialect.lineterminator

示例:

import csv

with open('./tmp/a8.csv', 'w', newline='', encoding='utf8') as csvfile:
    writer = csv.writer(csvfile, delimiter='&', quotechar='"', doublequote=False, escapechar='%',
                        lineterminator='\t')
    writer.writerow(['amo', 18, 168])
    writer.writerow(['jerry', 35, 158])
    writer.writerow(['crystal', 20, 170])

'''
amo&18&168	jerry&35&158	crystal&20&170	
'''

2.7.10 quotechar属性——定义字段的引用符

quotechar 属性用于定义字段的引用符,默认为双引号。引用符都是成对出现的,当 csv 文件中的文本数据中出现了 csv 文件使用的分隔符,此时将使用引用符将它括起来以排除歧义。语法格式如下:

Dialect.quotechar

示例:

import csv

with open('./tmp/a9.csv', 'w', newline='', encoding='utf8') as csvfile:
    writer = csv.writer(csvfile, delimiter='%', quotechar='"')
    writer.writerow(['编号', '员工姓名', '卡号', '备注'])
    writer.writerow(['mr001', '高猿员', '62299999123', 'mr'])
    writer.writerow(['mr002', '小%李', '62228888456', 'mr'])

'''
编号%员工姓名%卡号%备注
mr001%高猿员%62299999123%mr
mr002%"小%李"%62228888456%mr
'''

2.7.11 quoting属性——设置什么情况下对字段加入引用符

quoting 属性用来设置什么情况下对字段使用引用符。语法格式如下:

Dialect.quoting

quoting 属性的设置值如下:

  1. csv.QUOTE_ALL :writer 对象写入数据时对所有字段加入引用符。见 2.7.1 QUOTE_ALL常量——对所有字段加引用符 小节
  2. csv.QUOTE_MINIMAL :writer 对象写入数据时只对包含特殊字符的字段加入引用符。见 2.7.2 QUOTE_MINIMAL常量——只对包含特殊字符的字段加引用符 小节
  3. csv.QUOTE_NONE :writer 对象写入数据时对所有字段不加引用符。 见 2.7.3 QUOTE_NONE常量——对所有字段不加引用符 小节
  4. csv.QUOTE_NONNUMERIC :writer 对象写入数据时对所有非数字的字段加入引用符。见 2.7.4 QUOTE_NONNUMERIC常量——对所有非数字的字段加引用符 小节

2.7.12 reader.line_num属性——从csv文件读取行号

读取 csv 文件中的数据时,有时候为了处理数据方便而不需要表头,这种情况下可以使用 line_num 属性跳过第一行不读取表头,代码如下:

import csv

with open('./tmp/stu.csv', 'r', encoding='utf8') as file:
    reader = csv.reader(file)
    for row in reader:
        if reader.line_num == 1:
            continue
        else:
            print(row)

'''
['1', '20195844', '高一十二班']
['2', '20199172', '高一十二班']
['3', '20190495', '高一十二班']
['4', '20199035', '高一十二班']
['5', '20198153', '高一十二班']
['6', '20191362', '高一十二班']
['7', '20193697', '高一十二班']
['8', '20196357', '高一十二班']
['9', '20199604', '高一十二班']
'''

2.7.13 reader.f ieldnames属性——从文件中读取字段名称

reader 对象的 fieldnames 属性用于读取 csv 文件中字段的名称。语法格式如下:

reader.fieldnames

示例:

import csv

with open('./tmp/stu.csv', 'r', encoding='utf8') as file:
    # AttributeError: '_csv.reader' object has no attribute 'fieldnames'
    # reader = csv.reader(file)
    reader = csv.DictReader(file)
    print(reader.fieldnames)  # ['ID', '学号', '班级']
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐