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的资料请关注脚本之家其它相关文章!