Python读取CSV的四种方式实现与对比

 更新时间:2025年08月26日 09:54:49   作者:小庄-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的资料请关注脚本之家其它相关文章!

相关文章

  • 举例讲解Python编程中对线程锁的使用

    举例讲解Python编程中对线程锁的使用

    Python的threading模块中提供了多种锁的相关方法,Python的多线程不能同时执行,因而锁的使用非常关键,下面我们就来举例讲解Python编程中对线程锁的使用:
    2016-07-07
  • Python基于OCR实现图片识别翻译工具功能(附源码)

    Python基于OCR实现图片识别翻译工具功能(附源码)

    这篇文章主要为大家详细介绍了Python如何通过智能OCR文字识别和精准翻译技术,实现一键截图翻译,大幅提升跨语言阅读效率,让语言不再成为信息获取的障碍,感兴趣的可以了解下
    2025-11-11
  • matlab和Excel的数据交互操作(非xlsread和xlswrite)

    matlab和Excel的数据交互操作(非xlsread和xlswrite)

    在使用MATLAB时,可能会遇到很多表格数据的处理,有时MATLAB也需要利用现存的表格数据实现操作目的,下面这篇文章主要给大家介绍了关于matlab和Excel的交互操作的相关资料,非xlsread和xlswrite,需要的朋友可以参考下
    2021-08-08
  • Python 的 f-string 可以连接字符串与数字的原因解析

    Python 的 f-string 可以连接字符串与数字的原因解析

    这篇文章主要介绍了Python 的 f-string 可以连接字符串与数字的原因解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Python生成临时文件和文件夹的几种方法

    Python生成临时文件和文件夹的几种方法

    这篇文章主要介绍了在Python中生成临时文件和临时文件夹的方法,包括使用tempfile模块中的不同函数,以及推荐的做法,需要的朋友可以参考下
    2026-03-03
  • python进阶教程之动态类型详解

    python进阶教程之动态类型详解

    这篇文章主要介绍了python进阶教程之动态类型详解,动态类型是动态语言的特性,本文对多种动态类型应用做了讲解,需要的朋友可以参考下
    2014-08-08
  • 使用Keras加载含有自定义层或函数的模型操作

    使用Keras加载含有自定义层或函数的模型操作

    这篇文章主要介绍了使用Keras加载含有自定义层或函数的模型操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • 将string类型的数据类型转换为spark rdd时报错的解决方法

    将string类型的数据类型转换为spark rdd时报错的解决方法

    今天小编就为大家分享一篇关于将string类型的数据类型转换为spark rdd时报错的解决方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • matplotlib实战之饼图绘制详解

    matplotlib实战之饼图绘制详解

    饼图,或称饼状图,是一个划分为几个扇形的圆形统计图表,这篇文章主要为大家详细介绍了如何使用Matplotlib绘制饼图,需要的小伙伴可以参考下
    2023-08-08
  • Python中各类Excel表格批量合并问题的实现思路与案例

    Python中各类Excel表格批量合并问题的实现思路与案例

    在日常工作中,可能会遇到各类表格合并的需求。本文主要介绍了Python中各类Excel表格批量合并问题的实现思路与案例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01

最新评论