Python高效操作CSV技巧分享
珍惜时间,勤奋学习!今天给大家带来《Python操作CSV文件的实用方法》,正文内容主要涉及到等等,如果你正在学习文章,或者是对文章有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家!
答案:Python处理CSV文件有csv模块和pandas库两种主要方式,小规模简单数据用csv模块高效轻量,大规模或复杂操作则推荐pandas。csv模块适合基本读写,支持reader、DictReader、writer和DictWriter,便于处理表头和逐行操作;pandas将数据转为DataFrame,提供丰富数据分析功能,适合清洗、统计和多文件合并。处理大文件时可通过分块读取、指定数据类型、只读所需列和使用生成器优化性能;编码问题可用encoding参数解决,常见编码包括UTF-8、GBK等,并可结合errors参数处理解码错误;特殊字符需设置delimiter、quotechar等参数适配不同分隔符和引用规则;数据清洗常用操作包括处理缺失值、去重、类型转换和字符串清理。综合运用这些方法可高效应对各类CSV处理需求。

Python处理CSV文件,其实远比我们想象的要灵活和强大。无论是内置的csv模块,还是更高级的数据分析库pandas,都能让你高效地对这些逗号分隔值文件进行读写、清洗乃至复杂的数据操作。选择哪种方式,往往取决于你的具体需求和文件规模。
解决方案
操作CSV文件,通常我们有两个主要的选择:Python内置的csv模块,或者功能更强大的第三方库pandas。我个人在处理日常、结构相对简单的CSV时,会倾向于csv模块,因为它轻量、直接。但一旦数据量上去,或者需要进行复杂的数据分析、清洗,pandas几乎是我的不二之选,它能把CSV数据变成一个易于操作的DataFrame,那感觉就像给数据装上了翅膀。
使用Python内置的csv模块
这个模块是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
读取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文件时,直接一次性加载到内存中可能会导致内存溢出,或者处理速度非常慢。我遇到过几次这种情况,尤其是在服务器内存有限时,那种卡顿的感觉真是让人头疼。这时候,一些优化策略就显得尤为重要了。
分块读取 (
chunksizeinpandas.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')使用迭代器/生成器 (
csvmodule): 如果你坚持使用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')指定数据类型 (
dtypeinpandas.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')) # 查看内存使用情况只读取所需列 (
usecolsinpandas.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提供了相当完善的机制来应对这些挑战。
编码问题 (
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:
特殊字符和分隔符 (
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_linesinpandas): 有时候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)处理缺失值(Missing Values): 缺失值是数据清洗的头号公敌。
pandas提供了多种处理方式。- 检查缺失值:
isnull()或isna()配合sum()是我的常用组合。print("\n缺失值统计:\n", df.isnull().sum())
- 检查缺失值:
到这里,我们也就讲完了《Python高效操作CSV技巧分享》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于Python代码的知识点!
必访App私密书架添加教程
- 上一篇
- 必访App私密书架添加教程
- 下一篇
- 玻璃胶痕怎么清除?实用技巧分享
-
- 文章 · python教程 | 14分钟前 |
- Flask表单SMTP发邮件教程详解
- 484浏览 收藏
-
- 文章 · python教程 | 14分钟前 |
- Python异常处理技巧与代码健壮性提升
- 214浏览 收藏
-
- 文章 · python教程 | 32分钟前 |
- Python图邻接字典实现:避免重复边影响度数计算
- 283浏览 收藏
-
- 文章 · python教程 | 48分钟前 |
- Python浅拷贝到底拷贝什么?
- 249浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python数据清洗实战:pandas技巧全解析
- 112浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- HTTP状态码含义及调试方法
- 322浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python测试中如何动态设置@backoff重试次数
- 330浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- 键盘事件中断循环输入方法
- 283浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python异常处理详解:try-except用法解析
- 374浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- PDF图像提取与修复方法详解
- 253浏览 收藏
-
- 文章 · python教程 | 2小时前 |
- Pythonconfigparser仍可用吗?
- 326浏览 收藏
-
- 文章 · python教程 | 2小时前 |
- Python模块加载流程解析教程
- 371浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3679次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3946次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3887次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 5061次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 4259次使用
-
- Flask框架安装技巧:让你的开发更高效
- 2024-01-03 501浏览
-
- Django框架中的并发处理技巧
- 2024-01-22 501浏览
-
- 提升Python包下载速度的方法——正确配置pip的国内源
- 2024-01-17 501浏览
-
- Python与C++:哪个编程语言更适合初学者?
- 2024-03-25 501浏览
-
- 品牌建设技巧
- 2024-04-06 501浏览

