Python读取CSV的四种方式实现与对比
作者:小庄-Python办公
CSV(Comma-Separated Values)是一种常见的数据交换格式,Python提供了多种读取CSV文件的方法,下面就跟随小编一起详细一下具体的实现方法吧
概述
CSV(Comma-Separated Values)是一种常见的数据交换格式。Python提供了多种读取CSV文件的方法,每种方法都有其特点和适用场景。
方法一:使用csv模块(内置)
1.1 csv.reader()
import csv
with open('data.csv', 'r', encoding='utf-8') as file:
csv_reader = csv.reader(file)
headers = next(csv_reader) # 读取表头
for row in csv_reader:
print(row) # 每行是一个列表
特点:
- Python内置,无需安装额外库
- 内存占用小,适合大文件
- 逐行读取,节省内存
- 功能相对简单
1.2 csv.DictReader()
import csv
with open('data.csv', 'r', encoding='utf-8') as file:
csv_reader = csv.DictReader(file)
for row in csv_reader:
print(row['column_name']) # 通过列名访问
特点:
- 可以通过列名访问数据
- 代码更易读
- 内存占用比reader()稍大
方法二:使用pandas库
2.1 基本用法
import pandas as pd
df = pd.read_csv('data.csv')
print(df.head()) # 显示前5行
2.2 高级参数
df = pd.read_csv(
'data.csv',
encoding='utf-8', # 编码
sep=',', # 分隔符
header=0, # 表头行
index_col=0, # 索引列
usecols=['col1', 'col2'], # 指定列
nrows=1000, # 读取行数
skiprows=1, # 跳过行数
na_values=['NULL', ''], # 空值标识
dtype={'col1': str} # 数据类型
)
特点:
- 功能强大,参数丰富
- 支持数据分析和处理
- 与其他数据科学库集成好
- 需要安装pandas
- 内存占用较大
方法三:使用numpy库
3.1 numpy.loadtxt()
import numpy as np
# 适用于纯数值数据
data = np.loadtxt('data.csv', delimiter=',', skiprows=1)
3.2 numpy.genfromtxt()
import numpy as np
data = np.genfromtxt(
'data.csv',
delimiter=',',
names=True, # 使用第一行作为列名
dtype=None, # 自动推断类型
encoding='utf-8'
)
特点:
- 处理数值数据性能高
- 内存效率好
- 主要适用于数值数据
- 文本处理能力有限
方法四:手动解析
with open('data.csv', 'r', encoding='utf-8') as file:
lines = file.readlines()
headers = lines[0].strip().split(',')
data = []
for line in lines[1:]:
row = line.strip().split(',')
data.append(row)
特点:
- 完全可控,灵活性高
- 可处理特殊格式
- 代码复杂,容易出错
- 需要处理各种边界情况
特殊情况处理
处理编码问题
def read_csv_auto_encoding(filename):
encodings = ['utf-8', 'gbk', 'gb2312', 'utf-16']
for encoding in encodings:
try:
return pd.read_csv(filename, encoding=encoding)
except UnicodeDecodeError:
continue
return None
处理大文件(分块读取)
chunk_list = []
for chunk in pd.read_csv('large_file.csv', chunksize=1000):
# 处理每个块
chunk_list.append(chunk)
df = pd.concat(chunk_list, ignore_index=True)
处理复杂CSV(包含引号、逗号)
import csv
with open('complex.csv', 'r') as file:
reader = csv.reader(file, quotechar='"', delimiter=',', quoting=csv.QUOTE_ALL)
for row in reader:
print(row)
方法选择指南
| 场景 | 推荐方法 | 理由 |
|---|---|---|
| 数据分析 | pandas | 功能强大,生态完善 |
| 简单读取 | csv模块 | 内置库,轻量级 |
| 数值计算 | numpy | 性能优秀 |
| 大文件处理 | csv模块 + 逐行处理 | 内存友好 |
| 特殊格式 | 手动解析 | 灵活可控 |
| 快速原型 | pandas | 开发效率高 |
性能对比
| 方法 | 内存占用 | 处理速度 | 功能丰富度 | 学习成本 |
|---|---|---|---|---|
| csv模块 | 低 | 中 | 低 | 低 |
| pandas | 高 | 中 | 高 | 中 |
| numpy | 低 | 高 | 中 | 中 |
| 手动解析 | 低 | 低 | 自定义 | 高 |
最佳实践
优先使用pandas:除非有特殊需求,pandas是最佳选择
注意编码问题:中文数据常用utf-8或gbk编码
处理大文件:使用分块读取或csv模块
数据验证:读取后检查数据完整性
异常处理:添加适当的错误处理机制
示例代码
# Python读取CSV的几种方式
# 1. 使用csv模块(Python内置)
import csv
# 方法1.1: 使用csv.reader()读取
def read_csv_with_reader(filename):
"""
使用csv.reader()逐行读取CSV文件
适用于:简单的CSV文件读取,内存占用小
"""
with open(filename, 'r', encoding='utf-8') as file:
csv_reader = csv.reader(file)
# 读取表头
headers = next(csv_reader)
print(f"表头: {headers}")
# 读取数据行
for row in csv_reader:
print(row)
# 方法1.2: 使用csv.DictReader()读取
def read_csv_with_dictreader(filename):
"""
使用csv.DictReader()将每行转换为字典
适用于:需要按列名访问数据的场景
"""
with open(filename, 'r', encoding='utf-8') as file:
csv_reader = csv.DictReader(file)
for row in csv_reader:
print(row) # 每行是一个字典
# 可以通过列名访问:row['column_name']
# 2. 使用pandas库(需要安装:pip install pandas)
import pandas as pd
# 方法2.1: 基本读取
def read_csv_with_pandas_basic(filename):
"""
使用pandas读取CSV文件
适用于:数据分析、处理大量数据
"""
df = pd.read_csv(filename)
print(df.head()) # 显示前5行
return df
# 方法2.2: 带参数的读取
def read_csv_with_pandas_advanced(filename):
"""
使用pandas的高级参数读取CSV
"""
df = pd.read_csv(
filename,
encoding='utf-8', # 指定编码
sep=',', # 分隔符
header=0, # 表头行号
index_col=0, # 索引列
usecols=['col1', 'col2'], # 只读取指定列
nrows=1000, # 只读取前1000行
skiprows=1, # 跳过第1行
na_values=['NULL', ''], # 指定空值表示
dtype={'col1': str} # 指定列的数据类型
)
return df
# 3. 使用numpy库(需要安装:pip install numpy)
import numpy as np
# 方法3.1: 使用numpy.loadtxt()
def read_csv_with_numpy_loadtxt(filename):
"""
使用numpy.loadtxt()读取数值型CSV
适用于:纯数值数据,性能要求高
"""
data = np.loadtxt(filename, delimiter=',', skiprows=1) # 跳过表头
return data
# 方法3.2: 使用numpy.genfromtxt()
def read_csv_with_numpy_genfromtxt(filename):
"""
使用numpy.genfromtxt()读取CSV(更灵活)
适用于:包含缺失值的数值数据
"""
data = np.genfromtxt(
filename,
delimiter=',',
names=True, # 第一行作为列名
dtype=None, # 自动推断数据类型
encoding='utf-8',
missing_values='', # 缺失值标识
filling_values=0 # 缺失值填充
)
return data
# 4. 使用内置open()函数手动解析
def read_csv_manually(filename):
"""
手动解析CSV文件
适用于:特殊格式的CSV或需要自定义解析逻辑
"""
with open(filename, 'r', encoding='utf-8') as file:
lines = file.readlines()
# 解析表头
headers = lines[0].strip().split(',')
# 解析数据
data = []
for line in lines[1:]:
row = line.strip().split(',')
data.append(row)
return headers, data
# 5. 处理特殊情况的CSV
# 方法5.1: 处理不同编码的CSV
def read_csv_different_encoding(filename):
"""
处理不同编码的CSV文件
"""
encodings = ['utf-8', 'gbk', 'gb2312', 'utf-16']
for encoding in encodings:
try:
df = pd.read_csv(filename, encoding=encoding)
print(f"成功使用 {encoding} 编码读取文件")
return df
except UnicodeDecodeError:
continue
print("无法确定文件编码")
return None
# 方法5.2: 处理大文件(分块读取)
def read_large_csv_in_chunks(filename, chunk_size=1000):
"""
分块读取大型CSV文件
适用于:内存不足以加载整个文件的情况
"""
chunk_list = []
for chunk in pd.read_csv(filename, chunksize=chunk_size):
# 对每个块进行处理
processed_chunk = chunk # 这里可以添加处理逻辑
chunk_list.append(processed_chunk)
# 合并所有块
df = pd.concat(chunk_list, ignore_index=True)
return df
# 方法5.3: 处理包含引号和逗号的CSV
def read_csv_with_quotes(filename):
"""
处理包含引号和逗号的复杂CSV
"""
with open(filename, 'r', encoding='utf-8') as file:
csv_reader = csv.reader(file, quotechar='"', delimiter=',', quoting=csv.QUOTE_ALL)
for row in csv_reader:
print(row)
# 使用示例
if __name__ == "__main__":
# 创建示例CSV文件
sample_data = '''姓名,年龄,城市,薪资
张三,25,北京,8000
李四,30,上海,12000
王五,28,广州,10000
赵六,35,深圳,15000'''
with open('sample.csv', 'w', encoding='utf-8') as f:
f.write(sample_data)
print("=== 方法1: 使用csv.reader() ===")
read_csv_with_reader('sample.csv')
print("\n=== 方法2: 使用csv.DictReader() ===")
read_csv_with_dictreader('sample.csv')
print("\n=== 方法3: 使用pandas ===")
df = read_csv_with_pandas_basic('sample.csv')
print(df)
print("\n=== 方法4: 手动解析 ===")
headers, data = read_csv_manually('sample.csv')
print(f"表头: {headers}")
print(f"数据: {data}")
# 各种方法的对比总结:
"""
1. csv模块:
- 优点:Python内置,无需安装额外库,内存占用小
- 缺点:功能相对简单,不支持复杂的数据操作
- 适用:简单的CSV读取,小文件处理
2. pandas:
- 优点:功能强大,支持数据分析和处理,参数丰富
- 缺点:需要安装额外库,内存占用较大
- 适用:数据分析,复杂的数据处理,大部分CSV处理场景
3. numpy:
- 优点:处理数值数据性能高,内存效率好
- 缺点:主要适用于数值数据,对文本处理支持有限
- 适用:纯数值CSV文件,科学计算
4. 手动解析:
- 优点:完全可控,可以处理特殊格式
- 缺点:代码复杂,容易出错,需要处理各种边界情况
- 适用:特殊格式的CSV,需要自定义解析逻辑
选择建议:
- 数据分析:首选pandas
- 简单读取:使用csv模块
- 数值计算:考虑numpy
- 特殊需求:手动解析
"""
以上就是Python读取CSV的四种方式实现与对比的详细内容,更多关于Python读取CSV的资料请关注脚本之家其它相关文章!
