python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python读取CSV

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)  # 每行是一个列表

特点:

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'])  # 通过列名访问

特点:

方法二:使用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}         # 数据类型
)

特点:

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

您可能感兴趣的文章:
阅读全文