0

0

Python CSV文件处理:清理、格式化与编码转换实战

碧海醫心

碧海醫心

发布时间:2025-12-05 13:29:02

|

237人浏览过

|

来源于php中文网

原创

Python CSV文件处理:清理、格式化与编码转换实战

本教程详细介绍了如何使用python高效处理csv文件,涵盖了删除非数据行、添加自定义表头、修改字段分隔符、替换字段内容中的特定字符以及进行文件编码转换(如utf-16到utf-8)等核心操作。通过实例代码,演示了如何避免常见的i/o错误和类型错误,实现结构化、内存友好的csv数据清理与格式化,最终生成满足特定需求的新文件。

在数据处理工作中,CSV(逗号分隔值)文件因其简洁性而广泛应用。然而,原始的CSV文件往往存在格式不规范、包含冗余信息、编码不一致等问题,需要进行清理和转换才能用于进一步分析。本教程将引导您使用Python处理一个典型的CSV文件清理任务,包括:

  1. 删除特定行: 移除文件开头不包含实际数据的行,例如空行或分隔线。
  2. 添加新的文件头: 为处理后的数据定义清晰的列名。
  3. 更改字段分隔符: 将原始的逗号分隔符转换为分号分隔符。
  4. 替换字段内容: 将数据字段中的特定字符(如连字符-)替换为其他字符(如分号;)。
  5. 转换文件编码: 将输入文件的UTF-16编码转换为输出文件的UTF-8编码。
  6. 生成新文件: 在不修改原文件的情况下,创建包含所有更改的新CSV文件。

常见错误分析与规避

在进行文件操作时,开发者常会遇到一些问题。理解这些错误的根本原因有助于我们编写更健壮的代码。

1. ValueError: I/O operation on closed file.

此错误通常发生在尝试对已关闭的文件句柄进行读写操作时。在Python中,使用 with open(...) as file_object: 语句是管理文件资源的最佳实践。当代码块执行完毕或遇到异常时,with 语句会自动调用文件对象的 close() 方法,确保文件被正确关闭。

错误示例:

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

with open('input.csv', 'r') as read_file:
    # do something with read_file
    pass # 文件在此处被关闭

# 尝试再次读取已关闭的文件,将导致错误
for row in read_file:
    print(row)

解决方案: 确保所有文件操作都在 with 语句块内部进行,或者在同一个 with 语句中同时打开输入和输出文件。

2. AttributeError: 'list' object has no attribute 'split'

此错误表明您尝试在一个列表对象上调用 split() 方法。split() 方法是字符串(str)对象特有的,用于将字符串按指定分隔符拆分成字符串列表。列表对象没有此方法。

错误示例:

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

lines = [] # 这是一个列表
lines_ = lines.split('-') # 错误:列表没有split方法

解决方案: 确认您正在对字符串进行 split() 操作。如果您想处理列表中的每个字符串元素,需要遍历列表并对每个元素单独调用 split() 或 replace()。

解决方案:使用 csv 模块进行流式处理

为了高效且稳健地处理CSV文件,Python的 csv 模块是首选工具。它能够正确处理CSV文件的各种复杂情况,如字段中的逗号、引号等。同时,采用流式处理(即逐行读取和写入)可以避免将整个文件加载到内存中,这对于处理大型文件尤为重要。

1. 文件打开与编码处理

我们首先需要以正确的编码打开输入文件,并以目标编码打开输出文件。使用 with 语句同时管理两个文件句柄,确保它们在操作完成后自动关闭。

无限画
无限画

千库网旗下AI绘画创作平台

下载
import csv

input_file_path = 'input.csv'
output_file_path = 'output.csv'
new_header = ['column1', 'column2', 'column3', 'column4', 'column5', 'column6', 'column7', 'column8']

with open(input_file_path, 'r', encoding="utf-16") as read_file, \
     open(output_file_path, 'w', newline='', encoding="utf-8") as write_file:
    # 后续操作将在此处进行
    pass
  • encoding="utf-16": 指定输入文件的编码。
  • encoding="utf-8": 指定输出文件的编码。
  • newline='': 这是 csv 模块推荐的做法,用于避免在Windows系统上写入时出现额外的空行。

2. 初始化 CSV 读取器和写入器

使用 csv.reader 和 csv.writer 对象来处理CSV数据。

    reader = csv.reader(read_file, delimiter=",") # 输入文件使用逗号分隔
    writer = csv.writer(write_file, delimiter=";") # 输出文件使用分号分隔

3. 写入新的文件头

在处理数据之前,首先将定义好的新文件头写入输出文件。

    writer.writerow(new_header)

4. 过滤非数据行

原始文件可能包含空行、分隔线或其他不包含实际数据的行。我们可以通过检查行的长度或内容来动态过滤这些行。

  • 过滤空行或分隔线(如全连字符的行): 如果一行被解析后只有一个字段,且该字段为空或由特定字符组成(如--------------------),则很可能是不需要的数据。
  • 更健壮的过滤(基于数据类型): 对于结构化数据,可以尝试将某个关键字段转换为预期的数据类型(如浮点数)。如果转换失败,则说明该行不是有效数据行。

在本例中,len(row) == 1 可以有效地过滤掉 empty line 和 ------------------------------------ 这样的行,因为它们不包含逗号,会被 csv.reader 解析为只含一个元素的列表。

    for row in reader:
        # 过滤掉单字段行(如空行或全连字符行)
        if len(row) == 1:
            continue

        # 更高级的过滤示例:如果最后一列不是有效的浮点数,则跳过
        # try:
        #     _ = float(row[-1])
        # except ValueError:
        #     continue

        # ... 处理并写入有效行

5. 替换字段内容中的连字符

遍历当前行的每个字段,并将字段内的所有连字符 - 替换为分号 ;。这可以通过列表推导式高效完成。

        # 替换行中每个字段的连字符为分号
        processed_row = [field.replace('-', ';') for field in row]

需要注意的是,这里替换的是字段 内部 的连字符,而不是字段之间的分隔符。

6. 写入处理后的行

将处理后的行写入输出文件。

        writer.writerow(processed_row)

完整示例代码

结合上述所有步骤,以下是完整的Python代码,用于实现CSV文件的清理、格式化和转换。

import csv

def process_csv_file(input_file_path, output_file_path, new_header):
    """
    处理CSV文件,包括:
    1. 删除非数据行(如空行或分隔线)
    2. 添加新的文件头
    3. 更改分隔符从逗号(,)到分号(;)
    4. 替换字段内容中的连字符(-)为分号(;)
    5. 转换编码从UTF-16到UTF-8

    Args:
        input_file_path (str): 输入CSV文件的路径。
        output_file_path (str): 输出CSV文件的路径。
        new_header (list): 新的文件头列表。
    """
    try:
        with open(input_file_path, 'r', encoding="utf-16") as read_file, \
             open(output_file_path, 'w', newline='', encoding="utf-8") as write_file:

            reader = csv.reader(read_file, delimiter=",")
            writer = csv.writer(write_file, delimiter=";")

            # 1. 写入新的文件头
            writer.writerow(new_header)

            # 2. 逐行读取、处理并写入
            for row in reader:
                # 3. 过滤非数据行
                # 如果行只有一个字段,通常表示是空行或分隔线(如全连字符行)
                if len(row) == 1:
                    # 进一步检查是否是全连字符行,以确保准确性(可选,len(row)==1已足够)
                    # if all(c == '-' for c in row[0].strip()):
                    #     continue
                    continue

                # 4. 替换字段内容中的连字符(-)为分号(;)
                processed_row = [field.replace('-', ';') for field in row]

                # 5. 写入处理后的行
                writer.writerow(processed_row)

        print(f"CSV文件处理完成!输出文件已保存至:{output_file_path}")
    except FileNotFoundError:
        print(f"错误:文件 '{input_file_path}' 未找到。")
    except UnicodeDecodeError:
        print(f"错误:无法使用 'utf-16' 编码解码文件 '{input_file_path}'。请检查文件编码。")
    except Exception as e:
        print(f"处理文件时发生未知错误:{e}")

# 定义输入和输出文件路径
input_csv = 'input.csv'
output_csv = 'output.csv'

# 定义新的文件头
header_columns = [
    'CarType', 'Date', 'TimeRange', 
    'AvgValue', 'ShareExcludedOther'
]

# 调用函数进行处理
process_csv_file(input_csv, output_csv, header_columns)

注意事项:

  • 上述代码中的 new_header 示例仅包含5列,与原始数据中的实际列数可能不完全匹配。请根据您的实际数据调整 new_header 的内容和长度。
  • 过滤逻辑 if len(row) == 1: 适用于原始文件中没有逗号的空行或分隔线。如果您的非数据行中包含逗号,则需要更复杂的过滤逻辑,例如检查特定列是否为空或符合特定模式。
  • 如果输入文件中的列数与 new_header 的列数不一致,您可能需要在 processed_row 写入之前进行列的增删或重排。

总结

通过本教程,我们学习了如何使用Python的 csv 模块有效地清理、格式化和转换CSV文件。关键在于理解 with open() 进行文件资源管理、正确使用 csv.reader 和 csv.writer 对象、以及利用列表推导式对数据进行高效转换。采用流式处理不仅能避免内存溢出,还能显著提高处理大型文件的效率和鲁棒性。掌握这些技巧,将使您能够轻松应对各种复杂的CSV数据处理挑战。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

338

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

225

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

138

2026.02.12

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

847

2023.08.22

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1567

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

651

2023.11.24

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号