Python轻松处理CSV和Excel文件技巧
今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《Python轻松处理CSV与Excel文件方法》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!
答案:Python处理CSV和Excel文件最直接高效的方式是使用pandas库,它提供DataFrame结构简化数据操作。1. 读取文件时,pd.read_csv()和pd.read_excel()可加载数据,配合try-except处理文件缺失或读取异常;支持指定sheet_name读取特定工作表。2. 数据操作包括查看info()和describe()、布尔索引筛选、修改列值、添加新列等。3. 写入文件用to_csv()和to_excel(),后者结合ExcelWriter可写入多工作表。处理大型CSV时,采用分块读取(chunksize)、预设dtype优化内存、使用csv模块逐行处理,或转为Parquet/数据库提升性能。复杂操作如合并(pd.merge)、多条件筛选、pivot_table透视分析及缺失值处理(fillna/dropna)均便捷高效。常见错误包括编码问题(可用chardet检测)、文件路径错误(os.path.exists检查)、文件被占用(关闭Excel)、数据类型推断错误(指定dtype或na_values)及Excel文件损坏,调试时应结合print、info、head逐步排查。

Python处理CSV和Excel文件,最直接且高效的方式莫过于利用其强大的第三方库,尤其是pandas。它提供了一套非常直观且功能丰富的工具集,能让你轻松地读取、写入、操作和分析这两种格式的数据。对于纯文本的CSV,Python内置的csv模块也能提供更底层的控制。
解决方案
处理CSV和Excel文件,我个人首选pandas库。它将数据结构化为DataFrame,极大地简化了数据操作。
1. 读取文件:
CSV文件:
import pandas as pd try: df_csv = pd.read_csv('your_file.csv') print("CSV文件读取成功!") print(df_csv.head()) except FileNotFoundError: print("错误:CSV文件未找到,请检查路径。") except pd.errors.EmptyDataError: print("警告:CSV文件为空。") except Exception as e: print(f"读取CSV文件时发生未知错误: {e}")这里我喜欢用
try-except包裹,因为文件路径错误或空文件是常有的事,提前处理能避免程序崩溃。Excel文件:
import pandas as pd try: # 读取第一个工作表 df_excel = pd.read_excel('your_file.xlsx') print("Excel文件读取成功!") print(df_excel.head()) # 如果需要指定工作表,可以使用sheet_name参数 # df_excel_sheet2 = pd.read_excel('your_file.xlsx', sheet_name='Sheet2') # print("\n读取指定工作表成功!") # print(df_excel_sheet2.head()) except FileNotFoundError: print("错误:Excel文件未找到,请检查路径。") except Exception as e: print(f"读取Excel文件时发生未知错误: {e}")Excel文件可能包含多个工作表,
sheet_name参数非常实用。
2. 数据操作(以DataFrame为例):
一旦数据加载到DataFrame,你就可以进行各种操作了。
查看基本信息:
print(df_csv.info()) print(df_csv.describe()) # 统计描述
筛选数据:
# 筛选某一列值大于100的行 filtered_df = df_csv[df_csv['column_name'] > 100] print("\n筛选后的数据:") print(filtered_df.head())修改数据:
# 将某一列的值全部转换为大写 df_csv['text_column'] = df_csv['text_column'].str.upper() print("\n修改后的数据(text_column):") print(df_csv.head())添加新列:
df_csv['new_column'] = df_csv['column_A'] + df_csv['column_B'] print("\n添加新列后的数据:") print(df_csv.head())
3. 写入文件:
写入CSV文件:
df_csv.to_csv('output.csv', index=False) # index=False表示不写入行索引 print("\n数据已成功写入 output.csv")写入Excel文件:
df_excel.to_excel('output.xlsx', index=False) print("\n数据已成功写入 output.xlsx") # 写入多个工作表 with pd.ExcelWriter('multi_sheet_output.xlsx') as writer: df_csv.to_excel(writer, sheet_name='CSV_Data', index=False) df_excel.to_excel(writer, sheet_name='Excel_Data', index=False) print("数据已成功写入 multi_sheet_output.xlsx (包含多个工作表)")ExcelWriter是写入多工作表的关键,非常方便。
Python处理大型CSV文件有哪些优化策略?
处理大型CSV文件时,内存和性能往往是瓶颈。我个人在遇到GB级别的文件时,通常会从以下几个方面入手优化:
首先,分块读取(Chunking) 是最常见的策略。pandas.read_csv有一个chunksize参数,它不会一次性加载整个文件,而是返回一个迭代器,每次读取指定行数的数据块。这能显著减少内存占用,尤其是在你只需要对部分数据进行处理,或者需要聚合计算时。
import pandas as pd
chunk_size = 10000 # 每次读取1万行
total_rows_processed = 0
for chunk in pd.read_csv('large_file.csv', chunksize=chunk_size):
# 对每个chunk进行处理,例如筛选、聚合等
processed_chunk = chunk[chunk['value'] > 50]
# 或者将处理结果存储起来,最后再合并
# results.append(processed_chunk)
total_rows_processed += len(chunk)
print(f"已处理 {total_rows_processed} 行数据...")
# 最后可能需要将results合并成一个大的DataFrame
# final_df = pd.concat(results)其次,指定数据类型(dtype) 也是一个非常有效的优化手段。pandas在读取文件时,会尝试推断每一列的数据类型。如果你的文件很大,这个推断过程会消耗时间和内存。更重要的是,它可能会将实际上是整数的列推断为浮点数(因为有缺失值),或者将短字符串推断为object类型,这都会占用更多的内存。如果你对数据类型有了解,提前指定可以节省大量资源。
# 假设你知道'id'是int64,'name'是string,'value'是float32
optimized_df = pd.read_csv('large_file.csv', dtype={'id': 'int64', 'name': 'string', 'value': 'float32'})
print(optimized_df.info(memory_usage='deep')) # 比较内存占用特别是对于整数列,如果数值范围不大,使用int8, int16, int32而非默认的int64能节省一半甚至更多的内存。字符串类型也可以尝试使用category类型,如果列中重复值很多的话。
再者,使用Python内置的csv模块 进行低级别处理。对于某些极端情况,比如你只需要逐行读取数据,或者文件格式非常不规范,pandas可能显得过于“重”。Python的csv模块提供了csv.reader和csv.writer,它们以迭代器的方式工作,内存占用极低,非常适合处理超大型文件,但你需要手动解析每一行。
import csv
with open('very_large_file.csv', 'r', encoding='utf-8') as f:
reader = csv.reader(f)
header = next(reader) # 读取表头
for row in reader:
# 对每一行数据进行处理,例如写入数据库或进行简单计算
# print(row) # row是一个列表
pass这种方式的缺点是,你需要自己处理数据类型转换、缺失值、错误处理等,不如pandas方便。但当内存真的吃紧时,它是最后的堡垒。
最后,如果你的数据量真的非常巨大,或者需要频繁地查询和分析,可能需要考虑将数据导入到数据库中,例如SQLite、PostgreSQL,或者使用像Parquet这样的列式存储格式,它们在读取和查询大型数据集时效率更高。pandas可以直接将DataFrame写入SQL数据库或Parquet文件。
如何在Python中对Excel数据进行复杂操作,如合并、筛选和透视?
pandas在处理Excel数据方面,其DataFrame对象提供了极其强大的功能,让复杂的数据操作变得轻而易举。我通常会把Excel的各种“花活”都搬到pandas里来做,效率和可复用性都高得多。
1. 数据合并(Merging/Joining):
这就像SQL里的JOIN操作。当你从不同的Excel工作表或文件读取了相关联的数据时,通常需要将它们合并起来。
import pandas as pd
# 假设有两个DataFrame,df1包含订单信息,df2包含客户信息
df_orders = pd.DataFrame({
'OrderID': [1, 2, 3, 4],
'CustomerID': [101, 102, 101, 103],
'Amount': [100, 150, 200, 50]
})
df_customers = pd.DataFrame({
'CustomerID': [101, 102, 103],
'CustomerName': ['Alice', 'Bob', 'Charlie'],
'City': ['NY', 'LA', 'SF']
})
# 根据CustomerID进行内连接(inner join)
merged_df = pd.merge(df_orders, df_customers, on='CustomerID', how='inner')
print("合并后的数据:")
print(merged_df)
# 如果连接键名不同,可以使用left_on和right_on
# pd.merge(df1, df2, left_on='ID_in_df1', right_on='ID_in_df2', how='left')how参数可以控制连接类型,如'left', 'right', 'outer'等,这和SQL的逻辑是一致的。
2. 数据筛选(Filtering):
筛选是日常操作的重中之重。pandas的布尔索引非常灵活。
# 筛选金额大于120且客户在'NY'的订单
filtered_complex = merged_df[(merged_df['Amount'] > 120) & (merged_df['City'] == 'NY')]
print("\n复杂筛选后的数据:")
print(filtered_complex)
# 筛选CustomerName在特定列表中的订单
names_to_find = ['Alice', 'Charlie']
filtered_by_list = merged_df[merged_df['CustomerName'].isin(names_to_find)]
print("\n根据列表筛选后的数据:")
print(filtered_by_list)注意,多个条件筛选时要用括号将每个条件括起来,并使用&(与)或|(或)连接。
3. 数据透视(Pivoting):
这相当于Excel的“数据透视表”功能,用于对数据进行聚合和重塑,以从不同维度查看汇总信息。
# 假设我们想看每个城市和客户的订单总金额
pivot_table = pd.pivot_table(merged_df,
values='Amount',
index=['City', 'CustomerName'],
aggfunc='sum')
print("\n数据透视表(总金额):")
print(pivot_table)
# 也可以使用groupby进行类似操作
# grouped_data = merged_df.groupby(['City', 'CustomerName'])['Amount'].sum()
# print("\nGroupBy结果:")
# print(grouped_data)pivot_table非常强大,values指定要聚合的列,index指定行索引,columns(可选)指定列索引,aggfunc指定聚合函数(如sum, mean, count等)。groupby也能实现类似功能,但在需要更复杂的多维度透视时,pivot_table更直观。
4. 缺失值处理:
Excel数据常常不完整,pandas提供了多种处理缺失值(NaN)的方法。
# 假设df_orders中Amount列有缺失值
df_orders_with_nan = df_orders.copy()
df_orders_with_nan.loc[0, 'Amount'] = None # 模拟缺失值
print("\n带有缺失值的原始数据:")
print(df_orders_with_nan)
# 填充缺失值(例如用0填充)
df_filled = df_orders_with_nan.fillna(0)
print("\n填充缺失值后的数据:")
print(df_filled)
# 删除包含缺失值的行
df_dropped = df_orders_with_nan.dropna()
print("\n删除缺失值行后的数据:")
print(df_dropped)fillna()可以填充任意值,dropna()可以删除包含缺失值的行或列。
这些操作只是冰山一角,pandas的API非常丰富,熟练掌握后,处理Excel数据的效率会有一个质的飞跃。
Python处理CSV/Excel时常见的错误与调试技巧有哪些?
在用Python处理CSV和Excel文件时,我遇到过不少让人头疼的问题,总结下来,主要集中在文件格式、编码、数据类型和文件锁定上。理解这些常见错误并掌握一些调试技巧,能让你少走很多弯路。
1. 编码错误(UnicodeDecodeError):
这是我个人遇到最多,也最让人抓狂的错误之一。尤其是在处理来自不同系统或软件导出的CSV文件时,编码不一致是家常便饭。
错误现象:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xxx in position y: invalid start byte原因:
pandas.read_csv默认使用utf-8编码。如果你的CSV文件实际上是gbk、latin-1或其他编码,就会报错。调试技巧:
尝试指定编码: 最直接的方法是尝试不同的编码。
encoding='gbk'、encoding='latin-1'、encoding='iso-8859-1'是我最常尝试的几个。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')使用
chardet库检测编码: 如果实在不知道是什么编码,可以使用chardet库来猜测。import chardet with open('data.csv', 'rb') as f: raw_data = f.read(10000) # 读取文件开头一部分进行检测 result = chardet.detect(raw_data) print(f"检测到的编码是: {result['encoding']}") # 然后用检测到的编码去读取 # df = pd.read_csv('data.csv', encoding=result['encoding'])
2. 文件未找到错误(FileNotFoundError):
这个错误很直接,但有时候也容易犯。
- 错误现象:
FileNotFoundError: [Errno 2] No such file or directory: 'your_file.csv' - 原因: 文件路径不正确,或者文件根本不存在。
- 调试技巧:
- 检查路径: 确保文件路径是绝对路径,或者相对于你的脚本的正确相对路径。
- 使用
os.path.exists(): 在读取文件前先检查文件是否存在。import os file_path = 'non_existent_file.csv' if not os.path.exists(file_path): print(f"错误:文件 '{file_path}' 不存在。请检查路径。") else: df = pd.read_csv(file_path)
3. 文件被占用错误(PermissionError 或 IOError):
当你尝试写入一个正在被其他程序(比如Excel本身)打开的文件时,就会遇到这个问题。
- 错误现象:
PermissionError: [Errno 13] Permission denied: 'output.xlsx'或IOError: [Errno 13] Permission denied: 'output.csv' - 原因: 目标文件被其他程序锁定,Python无法对其进行写入操作。
- 调试技巧:
- 关闭文件: 确保你尝试写入的文件在任何其他程序中都是关闭的。这是最常见的原因。
- 更改文件名: 如果你只是想保存结果,可以暂时将输出文件名改一下,避免冲突。
- 等待或重试机制: 在自动化脚本中,有时可以实现一个简单的重试机制,等待几秒钟再尝试写入。
4. 数据类型推断错误:
pandas在读取CSV时会尝试推断列的数据类型,但这并不总是准确的,尤其是在数据不规范或包含混合类型时。
- 错误现象: 例如,一列数字中混入了一个文本值,
pandas可能会将整列推断为object(字符串),导致后续数值计算失败。或者日期列被读成字符串。 - 原因: 数据不干净,或者
pandas的推断机制不够“智能”。 - 调试技巧:
df.info()和df.head(): 经常使用这两个方法来检查DataFrame的列名、数据类型和前几行数据,快速发现问题。- 指定
dtype: 如果你知道某些列的正确数据类型,直接在read_csv或read_excel时通过dtype参数指定。df = pd.read_csv('data.csv', dtype={'id': int, 'value': float, 'date_col': str}) # 对于日期,可以先读成字符串,再用pd.to_datetime()转换 df['date_col'] = pd.to_datetime(df['date_col'], errors='coerce') # errors='coerce'会将无法转换的日期设为NaT na_values参数: 如果你的缺失值不是标准的空字符串,而是像'N/A'、'-'这样的字符串,pandas可能不会识别。使用na_values参数可以告诉pandas哪些值应该被视为缺失值。df = pd.read_csv('data.csv', na_values=['N/A', '-'])
5. Excel特定问题:
openpyxl.utils.exceptions.InvalidFileException: 尝试用read_excel读取一个损坏的Excel文件,或者一个实际上是CSV但后缀名是.xlsx的文件。- 调试技巧: 确保文件真的是一个有效的Excel文件。有时需要手动打开文件检查一下。
总而言之,处理文件数据,耐心和细致是关键。当遇到问题时,不要急于修改代码,先用print()语句、df.info()、df.head()等工具查看数据状态,一步步缩小问题范围,往往能事半功倍。
今天带大家了解了的相关知识,希望对你有所帮助;关于文章的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~
Laravel多级关联查询技巧详解
- 上一篇
- Laravel多级关联查询技巧详解
- 下一篇
- PHPMVC架构详解与实例演示
-
- 文章 · python教程 | 1分钟前 | 性能优化 Python正则表达式 re模块 匹配结果 正则模式
- Python正则表达式入门与使用技巧
- 112浏览 收藏
-
- 文章 · python教程 | 6分钟前 |
- MacPython兼容LibreSSL的解决方法
- 324浏览 收藏
-
- 文章 · python教程 | 39分钟前 |
- OdooQWeb浮点转整数技巧
- 429浏览 收藏
-
- 文章 · python教程 | 53分钟前 |
- VSCodePython开发全流程详解
- 348浏览 收藏
-
- 文章 · python教程 | 57分钟前 | 模块 包 代码复用 import Python函数模块化
- Python函数模块化技巧与实践解析
- 391浏览 收藏
-
- 文章 · python教程 | 1小时前 | Flask web开发
- Flask框架入门教程:Web开发实战指南
- 324浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Mako模板使用方法与实例详解
- 292浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Pythonpdb调试方法详解
- 109浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Pyodide集成BasthonTurtle教程与SVG渲染详解
- 447浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3176次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3388次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3417次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4522次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3796次使用
-
- 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浏览

