什么是CSV?

CSV(Comma-Separated Values)是一种简单的文件格式,用于存储表格数据,如电子表格或数据库。CSV文件中的每行代表表格中的一行,每行中的值用逗号(或其他分隔符)分隔。

Python的CSV模块

Python标准库中的csv模块提供了处理CSV文件的功能,它可以帮助你读取和写入CSV文件,处理各种CSV格式的变体。

读取CSV文件

基本读取

1
2
3
4
5
6
import csv

with open('data.csv', 'r', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
print(row)

读取为字典

1
2
3
4
5
6
import csv

with open('data.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
print(row)

写入CSV文件

基本写入

1
2
3
4
5
6
7
import csv

with open('output.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['姓名', '年龄', '城市'])
writer.writerow(['Alice', 25, '北京'])
writer.writerow(['Bob', 30, '上海'])

写入字典

1
2
3
4
5
6
7
8
import csv

fieldnames = ['姓名', '年龄', '城市']
with open('output.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'姓名': 'Alice', '年龄': 25, '城市': '北京'})
writer.writerow({'姓名': 'Bob', '年龄': 30, '城市': '上海'})

处理不同的分隔符

CSV文件不一定使用逗号作为分隔符,有时会使用制表符(\t)、分号(;)等。csv模块可以处理这些情况。

读取使用制表符分隔的文件

1
2
3
4
5
6
import csv

with open('data.tsv', 'r', encoding='utf-8') as f:
reader = csv.reader(f, delimiter='\t')
for row in reader:
print(row)

写入使用分号分隔的文件

1
2
3
4
5
6
import csv

with open('output.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f, delimiter=';')
writer.writerow(['姓名', '年龄', '城市'])
writer.writerow(['Alice', 25, '北京'])

处理引号

CSV文件中的值有时会用引号包围,特别是当值中包含逗号、换行符等特殊字符时。csv模块可以处理这些情况。

读取带引号的值

1
2
3
4
5
6
import csv

with open('data.csv', 'r', encoding='utf-8') as f:
reader = csv.reader(f, quotechar='"')
for row in reader:
print(row)

写入带引号的值

1
2
3
4
5
6
import csv

with open('output.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f, quoting=csv.QUOTE_ALL)
writer.writerow(['姓名', '年龄', '城市'])
writer.writerow(['Alice', 25, '北京'])

处理编码问题

在处理CSV文件时,编码问题是一个常见的挑战。特别是当CSV文件来自不同的系统时,可能会使用不同的编码。

读取使用不同编码的文件

1
2
3
4
5
6
import csv

with open('data.csv', 'r', encoding='gbk') as f:
reader = csv.reader(f)
for row in reader:
print(row)

写入使用特定编码的文件

1
2
3
4
5
6
import csv

with open('output.csv', 'w', newline='', encoding='gbk') as f:
writer = csv.writer(f)
writer.writerow(['姓名', '年龄', '城市'])
writer.writerow(['Alice', 25, '北京'])

实际应用示例

读取CSV文件并进行数据分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import csv

# 读取CSV文件
with open('sales.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
sales_data = list(reader)

# 计算总销售额
total_sales = 0
for row in sales_data:
total_sales += float(row['销售额'])

print(f"总销售额:{total_sales}")

# 按产品类别统计销售额
category_sales = {}
for row in sales_data:
category = row['产品类别']
sales = float(row['销售额'])
if category in category_sales:
category_sales[category] += sales
else:
category_sales[category] = sales

print("按产品类别统计销售额:")
for category, sales in category_sales.items():
print(f"{category}: {sales}")

写入数据到CSV文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import csv

# 准备数据
data = [
{'姓名': 'Alice', '年龄': 25, '城市': '北京'},
{'姓名': 'Bob', '年龄': 30, '城市': '上海'},
{'姓名': 'Charlie', '年龄': 35, '城市': '广州'}
]

# 写入到CSV文件
fieldnames = ['姓名', '年龄', '城市']
with open('people.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(data)

print("数据已写入到people.csv文件")

总结

Python的CSV模块是一个功能强大的工具,它可以帮助你轻松处理CSV文件。通过本文的介绍,你应该已经掌握了它的基本用法和常见技巧。

无论是读取CSV文件进行数据分析,还是将数据写入CSV文件进行存储,CSV模块都能满足你的需求。记住,在处理CSV文件时,要注意编码、分隔符和引号等问题,以确保数据的正确读取和写入。