Python读取CSV文件主要有两种方式:使用内置csv模块适合简单逐行处理,内存占用低;而pandas的read_csv()则将数据直接加载为DataFrame,便于数据分析。csv.reader按列表形式读取,适用于已知列顺序的场景;csv.DictReader以字典形式读取,通过列名访问更直观。pandas优势在于数据清洗、类型推断、缺失值处理及高性能操作,支持chunksize分块读取大型文件,usecols和dtype优化内存,同时可处理编码问题(如utf-8、gbk)和自定义分隔符,适应非标准格式。

Python读取CSV文件主要有两种主流且高效的方式:一是利用Python内置的
csv
pandas
read_csv()
在Python中处理CSV文件,我们通常会根据需求选择不同的工具。如果只是简单地遍历数据,或者对内存占用有严格要求,内置的
csv
pandas
使用Python内置的csv
csv
csv.reader
csv.DictReader
立即学习“Python免费学习笔记(深入)”;
csv.reader
import csv
file_path = 'data.csv' # 假设有一个名为data.csv的文件
try:
with open(file_path, mode='r', encoding='utf-8') as file:
reader = csv.reader(file)
header = next(reader) # 通常第一行是标题
print(f"文件头部: {header}")
for row in reader:
print(row)
# 假设我们想处理每一行的数据,比如计算某个字段的和
# if len(row) > 1 and row[1].isdigit(): # 简单检查,避免索引错误和非数字数据
# print(f"第二个字段的值: {row[1]}")
except FileNotFoundError:
print(f"错误:文件 '{file_path}' 未找到。")
except Exception as e:
print(f"读取文件时发生错误: {e}")这里需要注意
encoding
gbk
cp936
try-except
csv.DictReader
DictReader
import csv
file_path = 'data.csv'
try:
with open(file_path, mode='r', encoding='utf-8') as file:
reader = csv.DictReader(file)
for row in reader:
print(row)
# 你可以直接通过列名访问数据,比如
# if '姓名' in row:
# print(f"姓名: {row['姓名']}")
# if '年龄' in row and row['年龄'].isdigit():
# print(f"年龄: {row['年龄']}")
except FileNotFoundError:
print(f"错误:文件 '{file_path}' 未找到。")
except Exception as e:
print(f"读取文件时发生错误: {e}")在我看来,
DictReader
reader
使用pandas
pandas
import pandas as pd
file_path = 'data.csv'
try:
df = pd.read_csv(file_path, encoding='utf-8')
print("成功读取CSV文件,前5行数据如下:")
print(df.head())
print("\n数据框信息:")
df.info()
# 还可以直接访问列
# print(df['姓名'])
except FileNotFoundError:
print(f"错误:文件 '{file_path}' 未找到。")
except pd.errors.EmptyDataError:
print(f"错误:文件 '{file_path}' 是空的或不包含数据。")
except Exception as e:
print(f"读取文件时发生错误: {e}")pd.read_csv()
csv
Python内置的
csv
csv.reader
csv.DictReader
1. csv.reader
csv.reader
delimiter
,
;
\t
quotechar
"
skipinitialspace
True
csv.reader
pandas
csv.reader
csv.reader
示例(处理非标准分隔符):
import csv
# 假设文件data_semicolon.csv内容是:
# Name;Age;City
# Alice;30;New York
# Bob;24;London
file_path = 'data_semicolon.csv'
try:
with open(file_path, mode='r', encoding='utf-8') as file:
reader = csv.reader(file, delimiter=';') # 指定分号作为分隔符
header = next(reader)
print(f"头部(分号分隔): {header}")
for row in reader:
print(f"数据行: {row}")
except FileNotFoundError:
print(f"文件 '{file_path}' 未找到。")
except Exception as e:
print(f"读取文件时发生错误: {e}")2. csv.DictReader
csv.DictReader
fieldnames
delimiter
quotechar
csv.reader
DictReader
DictReader
DictReader
DictReader
示例(指定fieldnames
import csv
# 假设文件data_no_header.csv内容是:
# Alice,30,New York
# Bob,24,London
file_path = 'data_no_header.csv'
# 如果文件没有头部,但我们知道列的含义
column_names = ['姓名', '年龄', '城市']
try:
with open(file_path, mode='r', encoding='utf-8') as file:
reader = csv.DictReader(file, fieldnames=column_names)
# 如果有实际的头部行,但我们想跳过它并使用自定义的fieldnames
# next(reader) # 如果文件有头部但我们不想用,就跳过它
for row in reader:
print(f"姓名: {row['姓名']}, 年龄: {row['年龄']}, 城市: {row['城市']}")
except FileNotFoundError:
print(f"文件 '{file_path}' 未找到。")
except Exception as e:
print(f"读取文件时发生错误: {e}")总的来说,
csv
pandas
pandas
csv
pandas
csv
pandas
pandas
csv
df.head()
df.info()
df.describe()
pd.read_csv()
na_values
dropna()
fillna()
csv
pandas
astype()
csv
parse_dates
csv
datetime
drop_duplicates()
pandas
pd.read_csv()
csv
groupby()
sum()
mean()
count()
merge()
join()
concat()
csv
pandas
如何处理大型CSV文件?
当CSV文件大到无法一次性完全加载到内存时,
pandas
chunksize
chunksize
read_csv()
import pandas as pd
file_path = 'large_data.csv' # 假设这是一个非常大的CSV文件
chunk_size = 100000 # 每次读取10万行
total_rows_processed = 0
# 假设我们想计算某个列的总和
total_value_sum = 0
try:
for chunk in pd.read_csv(file_path, chunksize=chunk_size, encoding='utf-8'):
total_rows_processed += len(chunk)
# 在这里对每个chunk进行处理,例如:
if '数值列' in chunk.columns:
total_value_sum += chunk['数值列'].sum()
print(f"已处理 {total_rows_processed} 行数据...")
print(f"所有数据处理完毕。总行数: {total_rows_processed}, 数值列总和: {total_value_sum}")
except FileNotFoundError:
print(f"错误:文件 '{file_path}' 未找到。")
except Exception as e:
print(f"处理大型文件时发生错误: {e}")这种方式的缺点是,如果你需要全局性的操作(比如排序整个文件),分块处理会比较复杂。
nrows
nrows
import pandas as pd
df_preview = pd.read_csv('large_data.csv', nrows=1000, encoding='utf-8')
print(f"已读取前1000行数据,数据框形状: {df_preview.shape}")usecols
usecols
import pandas as pd
df_selected = pd.read_csv('large_data.csv', usecols=['ID', '姓名', '年龄'], encoding='utf-8')
print(f"只读取了指定列,数据框形状: {df_selected.shape}")dtype
pandas
dtype
import pandas as pd
df_optimized = pd.read_csv('large_data.csv', dtype={'ID': 'int32', '年龄': 'int16', '姓名': 'string'}, encoding='utf-8')
df_optimized.info(memory_usage='deep') # 查看内存使用情况尤其是对于整数和字符串列,使用更小的整数类型(如
int8
int16
int32
'category'
skiprows
skiprows
结合这些策略,
pandas
在实际工作中,CSV文件往往不是那么“标准”,经常会遇到编码错误和分隔符不一致的问题。这些问题如果不妥善处理,会导致数据乱码、解析失败,甚至程序崩溃。
1. 编码问题(UnicodeDecodeError
这是最常见也最令人头疼的问题之一。当程序尝试以错误的编码方式解码文件时,就会抛出
UnicodeDecodeError
问题表现:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x... in position ...: invalid start byte
���
解决方案:
明确指定编码: 最直接有效的方法就是在打开文件时,通过
encoding
csv
import csv
try:
# 尝试 'utf-8'
with open('data.csv', mode='r', encoding='utf-8') as f:
reader = csv.reader(f)
# ... 处理数据
except UnicodeDecodeError:
print("尝试UTF-8失败,尝试GBK...")
try:
# 尝试 'gbk' 或 'cp936' (Windows中文环境常用)
with open('data.csv', mode='r', encoding='gbk') as f:
reader = csv.reader(f)
# ... 处理数据
except UnicodeDecodeError:
print("尝试GBK也失败,尝试Latin-1...")
# 尝试 'latin-1' (有时用于包含各种非ASCII字符的文件)
with open('data.csv', mode='r', encoding='latin-1') as f:
reader = csv.reader(f)
# ... 处理数据
except FileNotFoundError:
print("文件未找到。")pandas
import pandas as pd
try:
df = pd.read_csv('data.csv', encoding='utf-8')
except UnicodeDecodeError:
print("尝试UTF-8失败,尝试GBK...")
try:
df = pd.read_csv('data.csv', encoding='gbk')
except UnicodeDecodeError:
print("尝试GBK也失败,尝试Latin-1...")
df = pd.read_csv('data.csv', encoding='latin-1')
except FileNotFoundError:
print("文件未找到。")猜测文件编码: 如果你不知道文件的确切编码,可以使用第三方库如
chardet
# 首先安装:pip install chardet
import chardet
def detect_encoding(file_path):
with open(file_path, 'rb') as f: # 以二进制模式读取
raw_data = f.read(100000) # 读取文件的前100KB进行检测
result = chardet.detect(raw_data)
return result['encoding']
file_以上就是Python怎么读取CSV文件_Python CSV文件读取方法详解的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号