Pandas 读取CSV文件

CSV(逗号分隔值)是最常见的数据交换格式之一。Pandas 提供的 read_csv() 函数功能强大,可以灵活地将 CSV 文件读取为 DataFrame,是数据分析的第一步。

📂 基本用法

最简单的用法只需传入文件路径:

import pandas as pd

df = pd.read_csv('data.csv')
print(df.head())

如果文件在工作目录下,直接写文件名;否则需要提供完整路径。同时支持读取网络上的 CSV 文件(传入 URL)。

⚙️ 常用参数详解

read_csv() 有数十个参数,下面列出最常用的几个:

sep / delimiter

指定分隔符,默认为逗号 ,。对于制表符分隔的文件可使用 sep='\t'

pd.read_csv('data.tsv', sep='\t')
header

指定作为列名的行号(从0开始)。默认为0(第一行)。若文件无列名,设置 header=None,并可用 names 参数指定列名。

pd.read_csv('data.csv', header=None, names=['A','B','C'])
names

自定义列名,需与 header=None 配合使用,或用于替换原有的列名。

pd.read_csv('data.csv', names=['ID','Name','Age'])
index_col

指定某列作为行索引。可以是列号(整数)或列名(字符串)。

pd.read_csv('data.csv', index_col=0)
usecols

只读取指定的列,提高效率。可传入列号列表或列名列表。

pd.read_csv('data.csv', usecols=['Name','Age'])
dtype

为列指定数据类型,避免自动推断错误或节省内存。

pd.read_csv('data.csv', dtype={'Age': int, 'Price': float})
skiprows

跳过文件开头的指定行数(或行号列表)。常用于跳过注释或无关内容。

pd.read_csv('data.csv', skiprows=2)   # 跳过前两行
pd.read_csv('data.csv', skiprows=[0,2]) # 跳过第1行和第3行
nrows

只读取前 n 行,适用于快速预览或处理大文件的一部分。

pd.read_csv('data.csv', nrows=100)
encoding

指定文件编码,常见为 'utf-8''gbk' 等。解决中文乱码问题。

pd.read_csv('data.csv', encoding='gbk')
na_values

指定额外的缺失值标记,这些值会被转换为 NaN

pd.read_csv('data.csv', na_values=['NA', 'NULL', '-'])
parse_dates

将指定的列解析为日期类型。

pd.read_csv('data.csv', parse_dates=['Date'])
chunksize

返回一个迭代器,用于逐块读取大文件,避免内存不足。

for chunk in pd.read_csv('big.csv', chunksize=10000):
    process(chunk)

🧪 综合示例

假设我们有一个名为 employees.csv 的文件,内容如下:

ID,Name,Age,Salary,HireDate
101,张三,28,8000,2020-06-15
102,李四,35,12000,2018-03-20
103,王五,29,9500,2021-09-10
104,赵六,41,15000,2015-12-01

现在使用各种参数进行读取:

import pandas as pd

# 1. 基本读取
df = pd.read_csv('employees.csv')
print(df.head())

# 2. 指定ID列为行索引,并将HireDate解析为日期
df2 = pd.read_csv('employees.csv', index_col='ID', parse_dates=['HireDate'])
print(df2.info())

# 3. 只读取Name、Salary两列,并设置Salary为float32类型
df3 = pd.read_csv('employees.csv', usecols=['Name', 'Salary'], dtype={'Salary': 'float32'})
print(df3)

# 4. 处理缺失值:假设文件中用'NULL'表示缺失,并指定编码
df4 = pd.read_csv('employees.csv', na_values=['NULL'], encoding='utf-8')
print(df4.isna().sum())

⚠️ 常见问题及解决方法

编码错误:如果读取时出现 UnicodeDecodeError,尝试更换 encoding 参数,例如 encoding='gbk'encoding='latin1'
分隔符不一致:某些文件可能混合了空格、制表符,可以设置 sep='\s+' 使用正则匹配连续空白。
大文件读取:若文件过大导致内存不足,使用 chunksize 分块处理,或指定 dtype 减少内存占用。
列名不匹配:检查文件是否有表头,使用 header=None 并手动指定 names
提示:读取后建议立即使用 df.info()df.head() 检查数据是否正确。对于大文件,可以先读一小部分(nrows=1000)来预览。