Skip to content

Pandas read_csv() 教程:像专业人士一样导入 CSV 文件

Updated on

pandas.read_csv() 是数据分析中最常用的函数之一。无论你是在导入小数据集还是数 GB 级别的大文件,理解 read_csv() 的工作机制,以及如何对其进行优化,都会为你节省大量时间、内存和调试成本。

这篇 2025 年最新版指南会手把手带你掌握如何把 CSV 文件导入得 干净、快速且准确,包括在 Pandas 2.0 中的最佳实践、PyArrow 引擎的使用、编码处理、日期解析以及常见错误的修复方法。


⚡ 想从 DataFrame 秒出可视化图表?

PyGWalker 可以在 Jupyter Notebook 中把你的 Pandas/Polars DataFrame 直接变成一个交互式可视化界面。

拖拽字段 → 即刻生成图表 → 以可视化方式探索数据。

一行代码即可体验:

pip install pygwalker
import pygwalker as pyg
gwalker = pyg.walk(df)
Run in Kaggle (opens in a new tab)Run in Google Colab (opens in a new tab)⭐️ Star PyGWalker (opens in a new tab)

什么是 pandas.read_csv()

read_csv() 是将 CSV 文件导入为 DataFrame(pandas 的核心数据结构)的主要方法。它支持:

  • 自定义分隔符
  • 缺失值处理
  • 类型自动推断或手动控制
  • 日期解析
  • 大文件流式读取
  • 多种解析引擎(Python、C、PyArrow)
  • 读取时直接设置索引
  • 高效的列选择

Pandas 2.0 引入了更快、更省内存的 PyArrow 后端,使得 CSV 加载更加高效和强大。


基本用法

import pandas as pd
 
df = pd.read_csv("your_file.csv")
df.head()

看起来很简单 —— 但在真实项目中,CSV 往往并不干净。接下来我们会讲解最实用的一些参数。


常用 read_csv() 参数速查表

参数说明
sep列分隔符(默认 ,
usecols只读取指定列
index_col指定某列作为索引
dtype手动指定数据类型
parse_dates自动解析日期列
na_values自定义缺失值标记
on_bad_lines遇到格式错误的行时跳过或警告
engine选择解析引擎:"python""c""pyarrow"
chunksize按分块流式读取大文件
encoding处理编码问题(如 utf-8latin-1 等)

1. 设置某列为索引

方案 A —— 读取完成后设置:

df = df.set_index("id")

方案 B —— 读取时直接指定:

df = pd.read_csv("file.csv", index_col="id")

2. 只读取指定列

这样可以加快读取速度并减少内存占用:

df = pd.read_csv("file.csv", usecols=["name", "age", "score"])

3. 处理缺失值

df = pd.read_csv("file.csv", na_values=["NA", "-", ""])

4. 自动解析日期

df = pd.read_csv("sales.csv", parse_dates=["date"])

Pandas 会自动推断合适的 datetime 格式。


5. 修复编码错误(非常常见)

df = pd.read_csv("file.csv", encoding="utf-8", errors="ignore")

如果 UTF-8 解析失败,可以尝试:

df = pd.read_csv("file.csv", encoding="latin-1")

6. 使用 PyArrow 引擎(Pandas 2.0+)

为了获得更快的解析速度和更好的内存效率:

df = pd.read_csv("file.csv", engine="pyarrow")

也可以结合新的 Arrow-backed dtypes 使用:

df = pd.read_csv(
    "file.csv",
    engine="pyarrow",
    dtype_backend="pyarrow"
)

7. 读取大体积 CSV(1GB–100GB)

使用分块读取(chunking):

reader = pd.read_csv("big.csv", chunksize=100_000)
 
for chunk in reader:
    process(chunk)

或者只读取必要的列并指定更紧凑的类型:

df = pd.read_csv(
    "big.csv",
    usecols=["user_id", "timestamp"],
    dtype={"user_id": "int32"},
)

8. 常见错误及解决方法

❌ UnicodeDecodeError

尝试指定编码:

encoding="latin-1"

❌ ParserError: Error tokenizing data

文件中包含格式损坏或不规则的行:

pd.read_csv("file.csv", on_bad_lines="skip")

❌ 大文件 MemoryError

可以尝试:

  • 使用 chunksize
  • 使用 usecols 减少列
  • 使用 Arrow 后端(dtype_backend="pyarrow"

❌ 分隔符不正确

pd.read_csv("file.csv", sep=";")

实战示例:干净地导入数据

df = pd.read_csv(
    "sales.csv",
    sep=",",
    parse_dates=["date"],
    dtype={"amount": "float64"},
    na_values=["NA", ""],
    engine="pyarrow"
)

什么时候适合用 CSV?什么时候该避免用 CSV?

CSV 适合:

  • 跨平台/跨工具的文件交换
  • 简单的数据处理流程
  • 小型或中等规模的数据集

但在以下场景你应尽量避免使用 CSV:

  • 需要极致的读写速度
  • 需要高效压缩
  • 需要严格的数据模式(schema)管理
  • 需要存储复杂数据类型

对于大规模分析场景,更推荐使用 Parquet 等列式存储格式。


常见问题(FAQs)

如何自动检测分隔符?

pd.read_csv("file.csv", sep=None, engine="python")

如何跳过文件开头的几行(如多重表头或说明)?

pd.read_csv("file.csv", skiprows=3)

如何读取压缩后的 CSV(zip 文件)?

pd.read_csv("file.csv.zip")

总结

pandas.read_csv() 是一个功能强大且非常灵活的 CSV 导入工具,几乎可以覆盖所有 CSV 导入场景 —— 从简单小文件到多 GB 的大型数据集。

只要理解并熟练运用这些常用参数,在 Pandas 2.0+ 中合理利用 PyArrow,并结合列选择、日期解析和错误处理等最佳实践,你的 CSV 数据加载流程会变得既高效又稳健。


更多 Pandas 教程