我的知识记录

Python Excel删除空行空列:清理脏数据一键搞定

用openpyxl扫描工作表,整行全空就删、整列全空就删,从下往上删避免行号错乱,附完整代码。

场景痛点

从系统导出的表,中间夹着好多空行,末尾还拖着几列全是空的辅助列;直接发给别人不专业,手动删又怕删到数据。用 openpyxl 扫一遍,整行所有单元格都空就删、整列全空就删,从下往上操作,干净利落。

用到的库

pip install openpyxl

完整代码

from openpyxl import load_workbook


def is_row_empty(ws, row_idx: int, max_col: int) -> bool:
for col in range(1, max_col + 1):
v = ws.cell(row=row_idx, column=col).value
if v is not None and str(v).strip() != "":
return False
return True


def is_col_empty(ws, col_idx: int, max_row: int) -> bool:
for row in range(2, max_row + 1):  # 跳过表头,表头有列名不算空
v = ws.cell(row=row, column=col_idx).value
if v is not None and str(v).strip() != "":
return False
return True


def clean_empty(file_path: str) -> None:
wb = load_workbook(file_path)

for ws in wb.worksheets:
max_row, max_col = ws.max_row, ws.max_column

# 1) 从下往上删空行(保留第 1 行表头)
for row_idx in range(max_row, 1, -1):
if is_row_empty(ws, row_idx, max_col):
ws.delete_rows(idx=row_idx, amount=1)

# 2) 从右往左删空列
for col_idx in range(max_col, 0, -1):
if is_col_empty(ws, col_idx, ws.max_row):
ws.delete_cols(idx=col_idx, amount=1)

print(f"[{ws.title}] 清理完成,剩余 {ws.max_row} 行 {ws.max_column} 列")

wb.save(file_path)
print("空行空列已清理")


if __name__ == "__main__":
clean_empty(r"D:\reports\销售明细.xlsx")

代码讲解

  • is_row_empty 检查某一行从第 1 列到最后一列,只要有一个格子不是 None 且去空格后不为空,就认为这行非空。
  • is_col_empty 类似,但从第 2 行开始检查,把表头排除——表头即使没值也不能删列。
  • 删除空行从下往上遍历(range(max_row, 1, -1)),删掉一行后上面行号不变,不会漏判。
  • 删除空列从右往左遍历(range(max_col, 0, -1)),同样是为了列号不错乱。
  • 删完行后 ws.max_row 变小了,删列时用最新的 ws.max_row 重新算。
  • 保留第 1 行表头,避免把列标题删掉。

运行结果

打开文件,中间的空行、末尾的空列都被清掉,数据行紧挨着表头;控制台打印每张表清理后的行列数。

注意事项

  • 「空」的判定标准是「值为 None 或去空格后为空字符串」,如果你的空行里有公式、空格、特殊字符,可能判定不准,按需要调整 is_row_empty
  • 从下往上删行、从右往左删列是必须遵守的顺序,反了会漏删。
  • 合并单元格的行/列如果参与了合并,删的时候可能报错,建议先取消合并再清理。
  • 删完之后 ws.auto_filter.ref、图表范围可能还指着旧范围,建议清理完再重设一次筛选和打印区域。
  • 大表逐格判断空值较慢,几万行也在可接受范围;更大的表用 pandas 处理更快。

Python Excel删除空行空列:清理脏数据一键搞定

标签:

更新时间:2026-09-15 09:09:29

上一篇:Python Excel删除行和列:delete_rows与delete_cols用法

下一篇:Python Excel数据去重 pandas drop_duplicates