在 python 中处理 excel 文件时,覆盖写入和追加写入是两种常见需求。通常使用 pandas 结合 openpyxl 或直接使用 openpyxl 来实现。
下面分别给出覆盖写入和追加写入的示例。
一、覆盖写入(清空原文件,写入新数据)
覆盖写入意味着每次运行代码时,都会完全替换原有 excel 文件中的内容。
1.1 使用 pandas 实现覆盖写入
import pandas as pd
# 创建示例数据
data = {
'姓名': ['张三', '李四', '王五'],
'分数': [85, 92, 78]
}
df = pd.dataframe(data)
# 覆盖写入(如果文件已存在会被覆盖)
df.to_excel('成绩表.xlsx', index=false, sheet_name='sheet1')
print("覆盖写入完成")1.2 使用 openpyxl 实现覆盖写入
直接创建新的 workbook 并保存,会覆盖原有文件。
from openpyxl import workbook
# 创建新工作簿
wb = workbook()
ws = wb.active
ws.title = "sheet1"
# 写入表头和数据
ws.append(['姓名', '分数'])
ws.append(['张三', 85])
ws.append(['李四', 92])
ws.append(['王五', 78])
# 保存(覆盖)
wb.save('成绩表.xlsx')
print("覆盖写入完成")二、追加写入(保留原数据,在末尾添加新行或新工作表)
追加写入分为两种情况:
- 在已有工作表末尾追加新行(不覆盖原有数据)
- 在同一个文件里增加新的工作表
2.1 使用 pandas + openpyxl 在现有工作表末尾追加行
pandas 的 to_excel 默认会覆盖整个文件,要实现追加,需要借助 openpyxl 读取原有数据并合并。
方法一:先读取原有数据,合并后再写入(适合数据量不大的情况)
import pandas as pd
from openpyxl import load_workbook
# 原有文件路径
file_path = '成绩表.xlsx'
# 读取原有数据
try:
df_old = pd.read_excel(file_path, sheet_name='sheet1')
except filenotfounderror:
df_old = pd.dataframe(columns=['姓名', '分数']) # 如果文件不存在则创建空dataframe
# 新数据
new_data = pd.dataframe({'姓名': ['赵六', '小明'], '分数': [88, 95]})
# 合并
df_new = pd.concat([df_old, new_data], ignore_index=true)
# 写回文件(覆盖原文件,实际是替换整个内容)
df_new.to_excel(file_path, index=false, sheet_name='sheet1')
print("追加写入完成")注意:这种方法本质还是覆盖写入,只是先读取旧数据再和新数据合并后一起写入,适合小文件。
方法二:使用 openpyxl 直接追加(更高效,不会丢失原文件的其他工作表)
from openpyxl import load_workbook
file_path = '成绩表.xlsx'
# 加载工作簿
try:
wb = load_workbook(file_path)
except filenotfounderror:
wb = workbook()
ws = wb.active
if ws.title != 'sheet1':
ws.title = 'sheet1'
# 追加数据(假设已有表头,直接从下一行开始写)
new_rows = [
['赵六', 88],
['小明', 95]
]
for row in new_rows:
ws.append(row)
wb.save(file_path)
print("追加写入完成")2.2 在现有 excel 文件中新增工作表(不影响原有工作表)
import pandas as pd
from openpyxl import load_workbook
file_path = '成绩表.xlsx'
# 新数据
df_new_sheet = pd.dataframe({'科目': ['数学', '语文', '英语'], '成绩': [95, 88, 92]})
# 方法一:使用 pandas 的 excelwriter 添加新工作表
with pd.excelwriter(file_path, engine='openpyxl', mode='a', if_sheet_exists='replace') as writer:
df_new_sheet.to_excel(writer, sheet_name='其他科目', index=false)
print("已新增工作表")注意:mode='a' 表示追加模式,if_sheet_exists='replace' 表示如果同名工作表存在则替换。
三、总结
| 操作 | 推荐方法 | 特点 |
|---|---|---|
| 覆盖写入 | pd.dataframe.to_excel() 或 openpyxl.workbook().save() | 最简单,直接替换原文件 |
| 追加行 | openpyxl 的 worksheet.append() | 不破坏原文件其他内容,性能较好 |
| 新增工作表 | pd.excelwriter(mode='a') | 保留原有工作表,添加新的 sheet |
| 完整追加(合并) | pd.concat() + to_excel() | 适合少量数据,会重写整个文件 |
如果需要频繁大量的追加操作,推荐使用 openpyxl 直接操作工作簿,避免反复读写整个文件。
四、方法补充
下面是小编整理的其他python实现对excel的覆盖追加操作的完整代码,感兴趣的可以了解下
from openpyxl import workbook, load_workbook
# 定义文件名和工作表名
filename = r"c:\users\administrator\downloads\example.xlsx"
# 第一次写入(创建文件并写入两个sheet)
def first_write():
# 加载或创建新工作簿
try:
wb = load_workbook(filename)
except filenotfounderror:
wb = workbook()
wb.remove(wb.active)
# 检查并删除已存在的 "作者" 工作表(如果存在)
if "机构" in wb.sheetnames:
del wb["机构"]
sheet1 = wb.create_sheet("机构")
for row in data1:
sheet1.append(row)
# 检查并删除已存在的 "作者" 工作表(覆盖/新建sheet)
if "作者" in wb.sheetnames:
del wb["作者"]
sheet2 = wb.create_sheet("作者")
for row in data2:
sheet2.append(row)
wb.save(filename)
# 第二次写入(追加sheet)
def second_write():
# 加载已存在的文件
wb = load_workbook(filename)
# 检查 "作者" 工作表是否存在,如果存在则获取它,否则创建一个新的
if "作者" in wb.sheetnames:
sheet2 = wb["作者"]
else:
sheet2 = wb.create_sheet("作者")
for row in data3:
sheet2.append(row)
wb.save(filename)
# 数据定义
data2 = [
['header1', 'header2', 'header3'],
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
data1 = [
['header11', 'header12', 'header13'],
[11, 2, 3],
[41, 5, 6],
[71, 8, 9]
]
data3 = [
[21, 2, 3],
[42, 5, 6],
[73, 8, 9]
]
# 执行写入操作
first_write() # 首次写入
second_write() # 覆盖写入
到此这篇关于python实现对excel的覆盖和追加操作的文章就介绍到这了,更多相关python excel覆盖和追加内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论