答案: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
处理CSV和Excel文件,我个人首选
pandas
1. 读取文件:
CSV文件:
立即学习“Python免费学习笔记(深入)”;
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
处理大型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
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
pandas
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'
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
# 假设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
在用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
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'
4. 数据类型推断错误:
pandas
pandas
object
pandas
df.info()
df.head()
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'会将无法转换的日期设为NaTna_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
.xlsx
总而言之,处理文件数据,耐心和细致是关键。当遇到问题时,不要急于修改代码,先用
print()
df.info()
df.head()
以上就是如何使用Python处理CSV和Excel文件?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号