使用csv模块和pandas是Python读取CSV文件最常用的方法;csv适合基础逐行处理,pandas则擅长高效的数据分析与大规模操作,结合二者可应对绝大多数场景。

Python读取CSV文件,最常用且高效的方式莫过于使用内置的
csv
pandas
说实话,处理CSV文件在日常工作中是再常见不过的任务了。我们来聊聊Python里那些真正好用的方法。
1. 使用Python内置的csv
csv
立即学习“Python免费学习笔记(深入)”;
基本读取:csv.reader
import csv
# 假设我们有一个名为 'data.csv' 的文件
# 内容可能是:
# Name,Age,City
# Alice,30,New York
# Bob,24,London
try:
    with open('data.csv', 'r', encoding='utf-8') as f:
        reader = csv.reader(f)
        # 跳过标题行,如果你不想要的话
        header = next(reader)
        print(f"文件头: {header}")
        for row in reader:
            print(row)
except FileNotFoundError:
    print("data.csv 文件不存在,请确保文件在当前目录下。")
except Exception as e:
    print(f"读取文件时发生错误: {e}")这里
encoding='utf-8'
reader = csv.reader(f, delimiter=';')
字典方式读取:csv.DictReader
DictReader
import csv
try:
    with open('data.csv', 'r', encoding='utf-8') as f:
        reader = csv.DictReader(f)
        for row in reader:
            # 假设CSV文件有'Name'和'Age'列
            print(f"姓名: {row['Name']}, 年龄: {row['Age']}")
except FileNotFoundError:
    print("data.csv 文件不存在。")
except KeyError as e:
    print(f"字典键错误,可能CSV文件缺少列名:{e}")
except Exception as e:
    print(f"读取文件时发生错误: {e}")是不是感觉方便多了?当CSV文件没有标题行时,你可以通过
fieldnames
2. 使用pandas
如果你的目标是数据分析、清洗、转换,或者处理的数据量较大,那么
pandas
NumPy
DataFrame
核心函数:pd.read_csv()
pandas
read_csv()
import pandas as pd
try:
    # 默认情况下,read_csv()会尝试识别分隔符,并假设第一行为标题
    df = pd.read_csv('data.csv', encoding='utf-8')
    print("使用pandas读取的数据框:")
    print(df.head()) # 打印前几行数据
    print("\n数据框信息:")
    df.info() # 查看数据类型和非空值数量
except FileNotFoundError:
    print("data.csv 文件不存在。")
except Exception as e:
    print(f"使用pandas读取文件时发生错误: {e}")pd.read_csv()
read_csv()
sep
delimiter
sep=';'
header
header=None
header=0
names
index_col
dtype
encoding
skiprows
nrows
chunksize
parse_dates
一个综合示例:
import pandas as pd
# 假设有一个文件 'complex_data.csv'
# 前两行是注释,第三行是标题,分隔符是制表符,日期列需要解析
# # This is a comment
# # Another comment
# ID\tName\tBirthday\tValue
# 1\tAlice\t1990-01-15\t100.5
# 2\tBob\t1985-03-20\t200.0
try:
    df_complex = pd.read_csv('complex_data.csv',
                             sep='\t', # 指定制表符为分隔符
                             skiprows=[0, 1], # 跳过前两行注释
                             parse_dates=['Birthday'], # 将Birthday列解析为日期
                             encoding='utf-8')
    print("\n使用更多参数读取的数据框:")
    print(df_complex.head())
    print("\n解析后的数据类型:")
    print(df_complex.dtypes)
except FileNotFoundError:
    print("complex_data.csv 文件不存在。")
except Exception as e:
    print(f"读取复杂文件时发生错误: {e}")在我多年的数据处理经验里,编码问题绝对是新手甚至老手都会频繁踩坑的地方。你经常会看到
UnicodeDecodeError
为什么会发生编码问题? 简单来说,不同的操作系统、不同的文本编辑器,甚至不同的国家,在保存文本文件时可能会使用不同的字符编码标准。比如,Windows系统下中文环境默认可能是
gbk
gb2312
utf-8
如何诊断和解决?
首选utf-8
utf-8
csv
pandas
encoding='utf-8'
# csv 模块
with open('file.csv', 'r', encoding='utf-8') as f:
    # ...
# pandas
df = pd.read_csv('file.csv', encoding='utf-8')尝试其他常见编码:gbk
gb2312
latin-1
iso-8859-1
utf-8
gbk
gb2312
latin-1
iso-8859-1
# 尝试 gbk
try:
    df = pd.read_csv('file.csv', encoding='gbk')
except UnicodeDecodeError:
    print("gbk 编码失败,尝试其他编码...")
    # 尝试 latin-1
    try:
        df = pd.read_csv('file.csv', encoding='latin-1')
    except Exception as e:
        print(f"所有尝试都失败了: {e}")利用chardet
chardet
chardet
import chardet
import pandas as pd
def detect_encoding(file_path, num_bytes=10000):
    """尝试检测文件的编码"""
    with open(file_path, 'rb') as f: # 以二进制模式读取
        raw_data = f.read(num_bytes) # 读取前N个字节
    result = chardet.detect(raw_data)
    return result['encoding']
file_path = 'unknown_encoding.csv'
detected_enc = detect_encoding(file_path)
print(f"检测到的编码是: {detected_enc}")
if detected_enc:
    try:
        df = pd.read_csv(file_path, encoding=detected_enc)
        print("成功以检测到的编码读取文件。")
    except Exception as e:
        print(f"使用检测到的编码 {detected_enc} 失败: {e}")
        # fallback to manual tries if detection fails
else:
    print("未能检测到编码,请手动尝试。")这是一个很实用的技巧,能帮你省下不少猜测的时间。
errors
open()
pd.read_csv()
errors='ignore'
errors='replace'
ignore
replace
# 忽略编码错误,但数据可能不完整或乱码
df = pd.read_csv('file.csv', encoding='utf-8', errors='ignore')总的来说,处理编码问题需要耐心和一点点试错。从
utf-8
gbk
chardet
latin-1
数据读取进来只是第一步,真正有价值的工作往往从数据清洗和预处理开始。
pandas
查看数据概览:df.info()
df.head()
df.tail()
df.info()
df.head()
df.tail()
# 假设 df 已经是一个 DataFrame
print("数据框信息概览:")
df.info()
print("\n数据框前5行:")
print(df.head())处理缺失值:isnull()
dropna()
fillna()
df.isnull().sum()
df.dropna()
axis=1
df.fillna(value)
# 检查缺失值
print("\n每列的缺失值数量:")
print(df.isnull().sum())
# 删除所有含有缺失值的行
df_cleaned = df.dropna()
print(f"\n删除缺失值后的行数: {len(df_cleaned)}")
# 用平均值填充某一列的缺失值
# 假设 'Age' 列有缺失值,且是数值类型
if 'Age' in df.columns and pd.api.types.is_numeric_dtype(df['Age']):
    df['Age'].fillna(df['Age'].mean(), inplace=True)
    print("\n'Age'列缺失值已用均值填充。")处理重复值:duplicated()
drop_duplicates()
df.duplicated().sum()
df.drop_duplicates()
subset
print(f"\n重复行数量: {df.duplicated().sum()}")
df_unique = df.drop_duplicates()
print(f"删除重复行后的行数: {len(df_unique)}")列名标准化:rename()
# 假设有一列名为 'User Name',我们想改成 'UserName'
if 'User Name' in df.columns:
    df.rename(columns={'User Name': 'UserName'}, inplace=True)
    print("\n列名 'User Name' 已重命名为 'UserName'。")数据类型转换:astype()
pd.to_datetime()
pd.to_numeric()
df.info()
df['column'].astype(int)
以上就是Python如何读取csv文件_Python读取csv文件方法总结的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号