使用 csv
模块读写 CSV 文件
逗号分隔值 (CSV) 文件格式是最常见的数据序列化和交换格式之一,其中每行是一组由分隔符分隔的值。
创建 CSV 文件的主要规则是:
- 每个字段由分隔符分隔。逗号 (
,
) 是 CSV 文件中使用的默认分隔符,但也可以使用其他分隔符(;
,\t
,|
等)。 - 如果任何字段值包含分隔符,则必须用一对引号字符(通常是双引号字符
"
)括起来。 - 可以有一个可选的单行标题,其中包含字段的名称。
下面是一个包含成绩数据的示例 CSV 文件:
Name,Subject,Marks
Anita,Maths,83.0
Amar,Maths,95.0
Akash,Science,92.0
Ira,Science,99.0
为了演示为什么需要引号字符,让我们看一下下面 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
Name,Subject,Marks
Anita,Maths,83.0
Amar,Maths,95.0
Akash,Science,92.0
Ira,Science,99.0
代码
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
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
代码
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()
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()
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
Name;Subject;Marks
Anita;Maths;83.0
Amar;Maths;95.0
Akash;Science;92.0
Ira;Science;99.0