Skip to content

使用 csv 模块读写 CSV 文件

逗号分隔值 (CSV) 文件格式是最常见的数据序列化和交换格式之一,其中每行是一组由分隔符分隔的值。

创建 CSV 文件的主要规则是:

  • 每个字段由分隔符分隔。逗号 (,) 是 CSV 文件中使用的默认分隔符,但也可以使用其他分隔符(;, \t, | 等)。
  • 如果任何字段值包含分隔符,则必须用一对引号字符(通常是双引号字符 ")括起来。
  • 可以有一个可选的单行标题,其中包含字段的名称。

下面是一个包含成绩数据的示例 CSV 文件:

csv
Name,Subject,Marks
Anita,Maths,83.0
Amar,Maths,95.0
Akash,Science,92.0
Ira,Science,99.0

为了演示为什么需要引号字符,让我们看一下下面 CSV 文件的内容,该文件包含每个学生某些科目(用逗号分隔)的平均分。

csv
Name,Average Of,Marks
Anita,"Accounting,Maths",83.0
Amar,"Accounting,Maths",95.0
Akash,"Physics,Chemistry,Biology",92.0
Ira,"Physics,Chemistry,Biology",99.0

Python 有内置的 csv 模块,提供读取和写入 CSV 文件的实用工具。

读取 CSV 文件

csv.reader(csvfile, delimiter=',', quotechar='"', **fmtparams) 函数用于返回 reader 对象,该对象逐行迭代 CSV 文件,并将其作为字符串列表返回。

csvfile 文件对象应使用 newline='' 参数打开,因为 csv 模块有自己的换行处理,可以根据平台或在嵌入带引号字段内的情况下正确解释换行符。

示例 #1

让我们编写一个程序来读取 marks.csv 的内容。

marks.csv

csv
Name,Subject,Marks
Anita,Maths,83.0
Amar,Maths,95.0
Akash,Science,92.0
Ira,Science,99.0

代码

python
import csv
try:
    with open('marks.csv', 'r', newline='', encoding='utf-8') as f:
        reader = csv.reader(f)
        #可以选择跳过标题行
        #header = next(reader)
        #print("标题:", header)
        for row in reader:
            print(row)
except FileNotFoundError:
    print("文件 'marks.csv' 未找到。")
except Exception as e:
    print(f"读取 CSV 时出错: {e}")

输出

['Name', 'Subject', 'Marks']
['Anita', 'Maths', '83.0']
['Amar', 'Maths', '95.0']
['Akash', 'Science', '92.0']
['Ira', 'Science', '99.0']

示例 #2

让我们编写一个程序来读取 marks2.csv 的内容。

注意分隔符和引号字符的变化。

marks2.csv

csv
Name|Average Of|Marks
Anita|^Accounting|Maths^|83.0
Amar|^Accounting|Maths^|95.0
Akash|^Physics|Chemistry|Biology^|92.0
Ira|^Physics|Chemistry|Biology^|99.0

代码

python
import csv
try:
    with open('marks2.csv', 'r', newline='', encoding='utf-8') as f:
        reader = csv.reader(f,
                    delimiter='|',
                    quotechar='^')
        for row in reader:
            print(row)
except FileNotFoundError:
    print("文件 'marks2.csv' 未找到。")
except Exception as e:
    print(f"读取 CSV 时出错: {e}")

输出

['Name', 'Average Of', 'Marks']
['Anita', 'Accounting|Maths', '83.0']
['Amar', 'Accounting|Maths', '95.0']
['Akash', 'Physics|Chemistry|Biology', '92.0']
['Ira', 'Physics|Chemistry|Biology', '99.0']

写入 CSV 文件

csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL, **fmtparams) 函数返回一个 writer 对象,该对象将列表形式的数据转换为分隔字符串,然后传递给文件对象进行写入。

列表中的所有非字符串数据在写入之前都会自动转换为字符串。quoting 参数控制何时生成引号 (e.g., csv.QUOTE_ALL 会给所有字段加引号)。

可以使用 writerow(row)writerows(rows) 方法将一行(字符串列表)或多行(行的列表)写入 CSV 文件。

示例 #3

编写一个程序,创建一个包含学生按科目划分成绩的 CSV 文件,使用分号 (;) 分隔。

解决方案 #1:使用 writerow()

python
import csv

h = ["Name","Subject","Marks"]

marks = [["Anita","Maths",83.0],
       ["Amar","Maths",95.0],
       ["Akash","Science",92.0],
       ["Ira","Science",99.0]]

try:
    with open('marks_output.csv', 'w', newline='', encoding='utf-8') as f:
        writer = csv.writer(f, delimiter=';')

        #写入标题
        writer.writerow(h)

        #写入数据
        for row in marks:
            writer.writerow(row)
    print("文件 'marks_output.csv' 写入成功。")
except IOError as e:
    print(f"写入 CSV 时出错: {e}")

解决方案 #2:使用 writerows()

python
import csv

h = ["Name","Subject","Marks"]

marks = [["Anita","Maths",83.0],
       ["Amar","Maths",95.0],
       ["Akash","Science",92.0],
       ["Ira","Science",99.0]]

try:
    with open('marks_output.csv', 'w', newline='', encoding='utf-8') as f:
        writer = csv.writer(f, delimiter=';')

        #写入标题
        writer.writerow(h)

        #写入数据 (一次写入多行)
        writer.writerows(marks)
    print("文件 'marks_output.csv' 写入成功。")
except IOError as e:
    print(f"写入 CSV 时出错: {e}")

输出 - marks_output.csv

csv
Name;Subject;Marks
Anita;Maths;83.0
Amar;Maths;95.0
Akash;Science;92.0
Ira;Science;99.0