讲师中心 微信公众号
AI工具推荐 视频效率加速

Python代码如何操作CSV文件 Python代码处理逗号分隔值文件的方法

阿萱同学_3374

阿萱同学_3374

发布时间:2025-11-15 08:51:48

|

1108人浏览过

|

来源于php中文网

原创

答案:Python处理CSV文件有csv模块和pandas库两种主要方式,小规模简单数据用csv模块高效轻量,大规模或复杂操作则推荐pandas。csv模块适合基本读写,支持reader、DictReader、writer和DictWriter,便于处理表头和逐行操作;pandas将数据转为DataFrame,提供丰富数据分析功能,适合清洗、统计和多文件合并。处理大文件时可通过分块读取、指定数据类型、只读所需列和使用生成器优化性能;编码问题可用encoding参数解决,常见编码包括UTF-8、GBK等,并可结合errors参数处理解码错误;特殊字符需设置delimiter、quotechar等参数适配不同分隔符和引用规则;数据清洗常用操作包括处理缺失值、去重、类型转换和字符串清理。综合运用这些方法可高效应对各类CSV处理需求。

python代码如何操作csv文件 python代码处理逗号分隔值文件的方法

Python处理CSV文件,其实远比我们想象的要灵活和强大。无论是内置的csv模块,还是更高级的数据分析库pandas,都能让你高效地对这些逗号分隔值文件进行读写、清洗乃至复杂的数据操作。选择哪种方式,往往取决于你的具体需求和文件规模。

解决方案

操作CSV文件,通常我们有两个主要的选择:Python内置的csv模块,或者功能更强大的第三方库pandas。我个人在处理日常、结构相对简单的CSV时,会倾向于csv模块,因为它轻量、直接。但一旦数据量上去,或者需要进行复杂的数据分析、清洗,pandas几乎是我的不二之选,它能把CSV数据变成一个易于操作的DataFrame,那感觉就像给数据装上了翅膀。

使用Python内置的csv模块

这个模块是Python标准库的一部分,不需要额外安装,非常适合基本的读写操作。

立即学习“Python免费学习笔记(深入)”;

读取CSV文件:

最基础的读取方式,你可以逐行遍历。

import csv

def read_basic_csv(filepath):
    data = []
    try:
        with open(filepath, 'r', newline='', encoding='utf-8') as csvfile:
            reader = csv.reader(csvfile)
            for row in reader:
                data.append(row)
        print("读取到的数据 (基础):", data)
    except FileNotFoundError:
        print(f"错误: 文件 '{filepath}' 未找到。")
    except Exception as e:
        print(f"读取文件时发生错误: {e}")

# 示例:假设有一个名为 'example.csv' 的文件
# 内容可能是:
# name,age,city
# Alice,30,New York
# Bob,24,London
# Charlie,35,Paris
# read_basic_csv('example.csv')

如果你想把每一行数据当作字典来处理,csv.DictReader会非常方便,它会自动把第一行作为键(header)。我发现这种方式在处理有明确表头的数据时特别好用,代码可读性也更高。

import csv

def read_dict_csv(filepath):
    data = []
    try:
        with open(filepath, 'r', newline='', encoding='utf-8') as csvfile:
            reader = csv.DictReader(csvfile)
            for row in reader:
                data.append(row)
        print("读取到的数据 (字典形式):", data)
        # 比如访问第一行的 'name' 字段
        if data:
            print("第一个人的名字:", data[0]['name'])
    except FileNotFoundError:
        print(f"错误: 文件 '{filepath}' 未找到。")
    except Exception as e:
        print(f"读取文件时发生错误: {e}")

# read_dict_csv('example.csv')

写入CSV文件:

写入也类似,有基础的csv.writer和更方便的csv.DictWriter。

import csv

def write_basic_csv(filepath, data_to_write):
    try:
        with open(filepath, 'w', newline='', encoding='utf-8') as csvfile:
            writer = csv.writer(csvfile)
            writer.writerows(data_to_write) # writerow() 写入单行
        print(f"数据已成功写入到 '{filepath}' (基础)。")
    except Exception as e:
        print(f"写入文件时发生错误: {e}")

# 示例数据
data_rows = [
    ['name', 'age', 'city'],
    ['David', 28, 'Berlin'],
    ['Eve', 22, 'Tokyo']
]
# write_basic_csv('new_example.csv', data_rows)

使用csv.DictWriter时,你需要先定义好字段名(fieldnames),这能确保你的字典键和CSV列的顺序保持一致。

import csv

def write_dict_csv(filepath, data_to_write, fieldnames):
    try:
        with open(filepath, 'w', newline='', encoding='utf-8') as csvfile:
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
            writer.writeheader() # 写入表头
            writer.writerows(data_to_write)
        print(f"数据已成功写入到 '{filepath}' (字典形式)。")
    except Exception as e:
        print(f"写入文件时发生错误: {e}")

# 示例数据
dict_data = [
    {'name': 'Frank', 'age': 40, 'city': 'Sydney'},
    {'name': 'Grace', 'age': 29, 'city': 'Seoul'}
]
field_names = ['name', 'age', 'city']
# write_dict_csv('new_dict_example.csv', dict_data, field_names)

使用pandas库

pandas是数据科学领域的事实标准,它将CSV数据加载到DataFrame对象中,提供了极其丰富的数据处理功能。如果你的任务不仅仅是简单的读写,那么pandas会是更好的选择。

安装pandas:

如果你还没安装,需要先运行:pip install pandas

python-script-generator
python-script-generator

快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。

下载

读取CSV文件:

一行代码就能搞定,非常简洁。

import pandas as pd

def read_pandas_csv(filepath):
    try:
        df = pd.read_csv(filepath, encoding='utf-8')
        print("使用pandas读取到的数据:\n", df.head()) # 显示前几行
        print("\n数据信息:\n", df.info())
        return df
    except FileNotFoundError:
        print(f"错误: 文件 '{filepath}' 未找到。")
        return None
    except Exception as e:
        print(f"使用pandas读取文件时发生错误: {e}")
        return None

# df_example = read_pandas_csv('example.csv')

写入CSV文件:

将DataFrame写入CSV也同样简单。

import pandas as pd

def write_pandas_csv(df, filepath):
    try:
        df.to_csv(filepath, index=False, encoding='utf-8') # index=False 避免写入行索引
        print(f"DataFrame已成功写入到 '{filepath}'。")
    except Exception as e:
        print(f"使用pandas写入文件时发生错误: {e}")

# 假设 df_example 是上面读取的DataFrame,或者自己创建一个
# data = {'name': ['Henry', 'Ivy'], 'age': [25, 33], 'city': ['London', 'Tokyo']}
# new_df = pd.DataFrame(data)
# write_pandas_csv(new_df, 'pandas_output.csv')

小结:

对我来说,选择csv模块还是pandas,更多是基于任务的复杂度和数据规模。如果只是快速地导入导出几列数据,csv模块足够了。但如果涉及到数据清洗、统计分析、多文件合并等,pandas的效率和功能优势就非常明显了。

Python处理大型CSV文件时,有哪些性能优化策略?

处理大型CSV文件时,直接一次性加载到内存中可能会导致内存溢出,或者处理速度非常慢。我遇到过几次这种情况,尤其是在服务器内存有限时,那种卡顿的感觉真是让人头疼。这时候,一些优化策略就显得尤为重要了。

  1. 分块读取 (chunksize in pandas.read_csv): 这是我处理大文件时最常用的方法。pandas的read_csv函数提供了一个chunksize参数,可以让你每次只读取文件的一部分,而不是一次性加载整个文件。这样,你可以在循环中处理每个数据块,大大降低内存消耗。

    import pandas as pd
    
    def process_large_csv_in_chunks(filepath, chunk_size=100000):
        total_rows_processed = 0
        processed_data_list = [] # 或者直接处理并保存到另一个文件
    
        try:
            for chunk_df in pd.read_csv(filepath, chunksize=chunk_size, encoding='utf-8'):
                # 对每个 chunk_df 进行操作,例如筛选、转换
                # 假设我们只想筛选年龄大于30的数据
                filtered_chunk = chunk_df[chunk_df['age'] > 30]
                processed_data_list.append(filtered_chunk)
                total_rows_processed += len(chunk_df)
                print(f"已处理 {total_rows_processed} 行数据...")
    
            # 最后可以将所有处理过的 chunk 合并,或者写入新文件
            final_df = pd.concat(processed_data_list)
            print(f"\n所有数据处理完毕,总计处理行数: {total_rows_processed}")
            print("筛选后的数据示例:\n", final_df.head())
            return final_df
        except FileNotFoundError:
            print(f"错误: 文件 '{filepath}' 未找到。")
            return None
        except Exception as e:
            print(f"处理大型CSV文件时发生错误: {e}")
            return None
    
    # process_large_csv_in_chunks('large_data.csv')
  2. 使用迭代器/生成器 (csv module): 如果你坚持使用csv模块,可以利用Python的生成器特性。这意味着你不会一次性把所有数据都读进内存,而是在需要时才生成一行数据。这对于极度节省内存的场景非常有用。

    import csv
    
    def process_large_csv_with_generator(filepath):
        try:
            with open(filepath, 'r', newline='', encoding='utf-8') as csvfile:
                reader = csv.reader(csvfile)
                header = next(reader) # 读取表头
                for row in reader:
                    # 在这里处理每一行数据,而不是将其存储起来
                    # 例如,打印符合条件的行
                    if int(row[1]) > 30: # 假设第二列是年龄
                        print(f"符合条件的行: {dict(zip(header, row))}")
        except FileNotFoundError:
            print(f"错误: 文件 '{filepath}' 未找到。")
        except Exception as e:
            print(f"处理大型CSV文件时发生错误: {e}")
    
    # process_large_csv_with_generator('large_data.csv')
  3. 指定数据类型 (dtype in pandas.read_csv):pandas在读取CSV时会尝试自动推断每列的数据类型。但对于大型文件,这可能既耗时又耗内存。明确指定数据类型可以显著减少内存占用,特别是当某些列可以存储为更小的整数类型(如int8、int16)或布尔类型时。

    import pandas as pd
    
    # 假设我们知道 'age' 是整数,'city' 是字符串
    dtypes = {
        'name': 'object', # 或者 'string' (pandas 1.0+)
        'age': 'int16',
        'city': 'object'
    }
    
    # df = pd.read_csv('large_data.csv', dtype=dtypes, encoding='utf-8')
    # print(df.info(memory_usage='deep')) # 查看内存使用情况
  4. 只读取所需列 (usecols in pandas.read_csv): 如果你的CSV文件有很多列,但你只需要其中的一部分,那么只读取这些列可以节省大量内存和处理时间。

    import pandas as pd
    
    # 只读取 'name' 和 'age' 列
    # df = pd.read_csv('large_data.csv', usecols=['name', 'age'], encoding='utf-8')

这些策略的组合使用,能让你在处理动辄几GB甚至几十GB的CSV文件时,也能保持程序的稳定性和效率。我通常会根据文件的实际大小和我的内存限制来决定采取哪种或哪几种策略。

如何在Python中处理CSV文件的编码问题和特殊字符?

CSV文件的编码问题和特殊字符,简直是数据处理中最常见的“坑”之一。我不知道有多少次因为编码问题导致乱码,或者因为特殊分隔符导致数据错位,那种调试的痛苦简直难以言喻。但好在Python提供了相当完善的机制来应对这些挑战。

  1. 编码问题 (encoding 参数): 这是最常见的问题。一个CSV文件可能不是以你期望的UTF-8编码保存的。常见的编码有UTF-8、GBK(中文Windows系统常见)、Latin-1(某些欧洲语言)等。

    • 在open()函数中指定: 当你使用csv模块时,open()函数是关键。务必指定正确的encoding参数。如果不知道具体编码,可以尝试几种常见的。

      import csv
      
      def read_csv_with_encoding(filepath, encoding='utf-8'):
          try:
              with open(filepath, 'r', newline='', encoding=encoding) as csvfile:
                  reader = csv.reader(csvfile)
                  for i, row in enumerate(reader):
                      if i < 5: # 只打印前5行
                          print(row)
                      else:
                          break
          except UnicodeDecodeError:
              print(f"错误: 尝试使用 '{encoding}' 编码读取失败。请尝试其他编码。")
          except FileNotFoundError:
              print(f"错误: 文件 '{filepath}' 未找到。")
          except Exception as e:
              print(f"读取文件时发生错误: {e}")
      
      # read_csv_with_encoding('data_gbk.csv', encoding='gbk')
      # read_csv_with_encoding('data_utf8.csv', encoding='utf-8')
    • 在pandas.read_csv()中指定:pandas也提供了encoding参数,用法类似。

      import pandas as pd
      
      def read_pandas_with_encoding(filepath, encoding='utf-8'):
          try:
              df = pd.read_csv(filepath, encoding=encoding)
              print(f"使用 {encoding} 编码读取成功:\n", df.head())
              return df
          except UnicodeDecodeError:
              print(f"错误: 尝试使用 '{encoding}' 编码读取失败。请尝试其他编码。")
              return None
          except FileNotFoundError:
              print(f"错误: 文件 '{filepath}' 未找到。")
              return None
          except Exception as e:
              print(f"读取文件时发生错误: {e}")
              return None
      
      # df_gbk = read_pandas_with_encoding('data_gbk.csv', encoding='gbk')
    • 错误处理 (errors 参数): 在open()函数中,errors参数可以指定如何处理编码错误。'ignore'会忽略无法解码的字符,'replace'会用一个替换字符(通常是?或�)代替它们。这在你想快速加载数据,即使有少量乱码也无所谓时很有用。

      # with open(filepath, 'r', newline='', encoding='utf-8', errors='ignore') as csvfile:
  2. 特殊字符和分隔符 (delimiter, quotechar, quoting 参数): CSV文件虽然叫“逗号分隔值”,但实际情况远比这复杂。我见过用分号、制表符甚至管道符作分隔符的。而且,如果数据本身包含逗号,就必须用引号括起来,否则就会被错误地解析。

    • 指定分隔符 (delimiter): 当你的文件不是用逗号分隔时,你需要明确告诉csv模块或pandas。

      import csv
      import pandas as pd
      
      # 假设文件 'data_semicolon.csv' 是用分号分隔的
      # name;age;city
      # Alice;30;New York
      
      # csv 模块
      # with open('data_semicolon.csv', 'r', newline='', encoding='utf-8') as csvfile:
      #     reader = csv.reader(csvfile, delimiter=';')
      #     for row in reader:
      #         print(row)
      
      # pandas
      # df = pd.read_csv('data_semicolon.csv', sep=';', encoding='utf-8')
      # print(df.head())
    • 处理引号和引用规则 (quotechar, quoting): 如果你的数据中包含分隔符,通常会用引号(默认为双引号")将该字段括起来。csv模块的quotechar指定了引用字符,quoting参数则控制引用行为。

      • csv.QUOTE_MINIMAL (默认): 只对包含delimiter、quotechar或lineterminator的字段加引号。
      • csv.QUOTE_ALL: 对所有字段加引号。
      • csv.QUOTE_NONNUMERIC: 对所有非数字字段加引号。
      • csv.QUOTE_NONE: 不对任何字段加引号(此时如果字段内有分隔符会出问题)。
      import csv
      
      # 假设文件 'data_quoted.csv' 包含逗号,并用双引号括起来
      # "name","description"
      # "Product A","This is a great product, it has many features."
      
      # with open('data_quoted.csv', 'r', newline='', encoding='utf-8') as csvfile:
      #     reader = csv.reader(csvfile, quotechar='"', quoting=csv.QUOTE_MINIMAL)
      #     for row in reader:
      #         print(row)
      
      # pandas 默认就能很好地处理这种情况
      # df = pd.read_csv('data_quoted.csv', encoding='utf-8')
      # print(df.head())
    • 跳过坏行 (error_bad_lines / on_bad_lines in pandas): 有时候CSV文件会有格式不规范的行,比如列数不匹配。pandas的read_csv在旧版本中有一个error_bad_lines=False参数可以忽略这些行,在新版本(2.0+)中改为了on_bad_lines='skip'。

      # df = pd.read_csv('malformed.csv', on_bad_lines='skip', encoding='utf-8')

理解并灵活运用这些参数,能帮你解决绝大部分CSV文件在编码和特殊字符方面的问题,让数据加载过程变得顺畅。我通常会先用chardet这样的库猜测一下文件的编码,然后再用pandas或csv模块尝试读取,如果遇到问题,再根据错误信息调整参数。

除了读写,Python还能对CSV数据进行哪些常见的数据清洗和转换操作?

仅仅读写CSV文件,往往只是万里长征的第一步。真实世界的数据,总是充满了各种不规范、缺失和错误。Python在数据清洗和转换方面,尤其是结合pandas库,提供了极其丰富的功能。对我而言,这些操作是数据分析工作中不可或缺的环节。

假设我们已经将CSV数据加载到了一个pandas DataFrame中:

import pandas as pd
import numpy as np

# 创建一个示例DataFrame
data = {
    'ID': [1, 2, 3, 4, 5, 6],
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank'],
    'Age': [25, 30, np.nan, 35, 28, 40],
    'City': ['New York', 'London', 'Paris', 'New York', 'Berlin', np.nan],
    'Salary': [50000, 60000, 75000, 52000, 68000, 90000],
    'Experience': ['5 years', '10 years', 'unknown', '7 years', '3 years', '15 years']
}
df = pd.DataFrame(data)
print("原始DataFrame:\n", df)
  1. 处理缺失值(Missing Values): 缺失值是数据清洗的头号公敌。pandas提供了多种处理方式。

    • 检查缺失值: isnull() 或 isna() 配合 sum() 是我的常用组合。
      print("\n缺失值统计:\n", df.isnull().sum())

热门AI工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

320

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

232

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

411

2026.04.13

pip安装使用方法
pip安装使用方法

安装步骤:1、确保Python已经正确安装在您的计算机上;2、下载“get-pip.py”脚本;3、按下Win + R键,然后输入cmd并按下Enter键来打开命令行窗口;4、在命令行窗口中,使用cd命令切换到“get-pip.py”所在的目录;5、执行安装命令;6、验证安装结果即可。大家可以访问本专题下的文章,了解pip安装使用方法的更多内容。

2690

2023.10.09

更新pip版本
更新pip版本

更新pip版本方法有使用pip自身更新、使用操作系统自带的包管理工具、使用python包管理工具、手动安装最新版本。想了解更多相关的内容,请阅读专题下面的文章。

6183

2024.12.20

pip设置清华源
pip设置清华源

设置方法:1、打开终端或命令提示符窗口;2、运行“touch ~/.pip/pip.conf”命令创建一个名为pip的配置文件;3、打开pip.conf文件,然后添加“[global];index-url = https://pypi.tuna.tsinghua.edu.cn/simple”内容,这将把pip的镜像源设置为清华大学的镜像源;4、保存并关闭文件即可。

7742

2024.12.23

python升级pip
python升级pip

本专题整合了python升级pip相关教程,阅读下面的文章了解更多详细内容。

3827

2025.07.23

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2631

2023.10.31

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

80

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
vscode手册
vscode手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn