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

相关文章

  • Pytorch 神经网络—自定义数据集上实现教程

    Pytorch 神经网络—自定义数据集上实现教程

    今天小编就为大家分享一篇Pytorch 神经网络—自定义数据集上实现教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • 如何将你的应用迁移到Python3的三个步骤

    如何将你的应用迁移到Python3的三个步骤

    这篇文章主要介绍了如何将你的应用迁移到Python3的三个步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • CentOS7.3编译安装Python3.6.2的方法

    CentOS7.3编译安装Python3.6.2的方法

    本篇文章主要介绍了CentOS7.3编译安装Python3.6.2的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Django + Uwsgi + Nginx 实现生产环境部署的方法

    Django + Uwsgi + Nginx 实现生产环境部署的方法

    Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式。这篇文章主要介绍了Django + Uwsgi + Nginx 实现生产环境部署,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Pycharm中python调用另一个文件类或者函数

    Pycharm中python调用另一个文件类或者函数

    本文主要介绍了Pycharm中python调用另一个文件类或者函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • python实现随机加减法生成器

    python实现随机加减法生成器

    这篇文章主要为大家详细介绍了python实现随机加减法生成器,练手小项目,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • 详解python里使用正则表达式的分组命名方式

    详解python里使用正则表达式的分组命名方式

    这篇文章主要介绍了详解python里使用正则表达式的分组命名方式的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-10-10
  • Python批量图片去水印的方法

    Python批量图片去水印的方法

    ​平常工作中,有时为了采用网络的一些素材,但这些素材往往被打了水印,如果我们不懂PS就无法去掉水印,或者无法批量去掉水印。本文就介绍了Python批量图片去水印的方法,感兴趣的可以了解一下
    2021-05-05
  • python实现在cmd窗口显示彩色文字

    python实现在cmd窗口显示彩色文字

    今天小编就为大家分享一篇python实现在cmd窗口显示彩色文字,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • Python自动化之UnitTest框架实战记录

    Python自动化之UnitTest框架实战记录

    这篇文章主要给大家介绍了关于Python自动化之UnitTest框架实战的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09

最新评论