|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- import os
- from openpyxl import load_workbook
- file_path = os.path.join("try01","临考记忆点.xlsx")
- # 1.获取workbook对象
- work_book_object = load_workbook(file_path)
- sheet_object = work_book_object["Sheet1"]
- # 获取合并的单元格,如果是被合并的单元格 让值默认等于 -
- from openpyxl.cell.cell import Cell,MergedCell
- row_text_list = []
- for row in sheet_object.rows:
- for cell in row:
- if type(cell) == Cell:
- row_text_list.append(cell.value)
- elif type(cell) == MergedCell:
- row_text_list.append("-")
- # print(row_text_list)
- for i in row_text_list:
- if i == "-" or i == None:
- row_text_list.remove(i)
- print(row_text_list)
复制代码
- import os
- from openpyxl import load_workbook
- file_path = os.path.join("try01","临考记忆点.xlsx")
- # 1.获取workbook对象
- work_book_object = load_workbook(file_path)
- sheet_object = work_book_object["Sheet1"]
- # 获取合并的单元格,如果是被合并的单元格 让值默认等于 -
- from openpyxl.cell.cell import Cell,MergedCell
- row_text_list = []
- for row in sheet_object.rows:
- for cell in row:
- if type(cell) == Cell:
- row_text_list.append(cell.value)
- elif type(cell) == MergedCell:
- row_text_list.append("-")
- # print(row_text_list)
- for i in row_text_list:
- if i == "-" or i == None:
- row_text_list.remove(i)
- print(row_text_list)
复制代码
我有一个excel表格,其中有很多合并后的单元格,为什么这两段代码处理后 输出的结果会不一样,第一段代码是我想要的结果,而第二段代码处理的结果前面是我想要的结果从中间开始就感觉没有处理了
你遇到的问题是因为在迭代列表的同时修改列表内容导致的。让我们分析一下两段代码的区别:
第一段代码(正确):
- for i in row_text_list:
- if i == "-" or i == None:
- row_text_list.remove(i)
复制代码
第二段代码(有问题):
- for i in row_text_list:
- if i == "-" or i == None:
- row_text_list.remove(i)
复制代码
关键区别:
第二段代码的 for i in row_text_list: 循环缩进错误,它被放在了 for cell in row: 循环内部,这意味着:
1. 每处理一个单元格,就会对整个 row_text_list 进行一次遍历和删除操作
2. 这会导致循环逻辑混乱,容易跳过某些元素
问题原因:
在遍历列表的同时删除元素会导致问题,因为 Python 的迭代器会"丢失"一些元素。例如:
- 列表:[1, "-", 2, "-", 3]
- 删除第一个 "-" 后:[1, 2, "-", 3]
- 但迭代器已经移动到下一个位置,会跳过 2
解决方案:
推荐使用列表推导式来过滤,这样更清晰且不会出错:
- import os
- from openpyxl import load_workbook
- from openpyxl.cell.cell import Cell, MergedCell
- file_path = os.path.join("try01", "临考记忆点.xlsx")
- work_book_object = load_workbook(file_path)
- sheet_object = work_book_object.active # 注意:这里应该是获取具体的工作表
- row_text_list = []
- for row in sheet_object.rows:
- for cell in row:
- if isinstance(cell, Cell):
- row_text_list.append(cell.value)
- elif isinstance(cell, MergedCell):
- row_text_list.append("-")
- # 使用列表推导式过滤
- row_text_list = [item for item in row_text_list if item not in ("-", None)]
- print(row_text_list)
复制代码
注意事项:
1. sheet_object = work_book_object 应该是 sheet_object = work_book_object.active 或其他具体的工作表
2. 使用 isinstance(cell, Cell) 比 type(cell) == Cell 更规范
3. 推荐使用列表推导式而不是在迭代中删除元素
如果你的代码确实需要按照原来的逻辑,可以这样修复第二段代码:
- # 创建一个临时列表来存储要删除的索引
- to_remove = []
- for index, i in enumerate(row_text_list):
- if i == "-" or i is None:
- to_remove.append(index)
- # 从后往前删除,避免索引错位
- for index in reversed(to_remove):
- del row_text_list[index]
复制代码
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
|
|