要注意運行速度,避免多次重複循環
时间: 2024-03-28 22:41:33 浏览: 12
非常正确。为了提高代码的效率,我们可以尽可能地避免重复的循环。以下是针对您的问题的一些优化建议:
1. 遍历第三列时,可以将日期作为键,整行数据作为值,将它们存储在一个字典中。这样可以避免在后面的循环中多次遍历第三列。
2. 在处理列表1和列表2时,可以先将它们的数据读取到内存中,然后在内存中进行处理,最后再将结果写回到 Excel 文件中。这样可以避免多次读写 Excel 文件,提高代码的效率。
3. 在遍历列表1时,可以使用一个集合来存储列表2中的工作表名,这样就可以避免在后面的循环中多次遍历列表2。
下面是优化后的代码,供您参考:
```python
from openpyxl import load_workbook
from collections import defaultdict
import datetime
# 打开工作薄1
wb1 = load_workbook('工作薄1.xlsx')
# 打开工作薄2
wb2 = load_workbook('工作薄2.xlsx')
# 获取所有工作表的名称
sheet_names = wb1.sheetnames
# 获取当前工作表的名称和当前时间
sheet_name = wb2.active.title
now_time = datetime.datetime.now().strftime('%H:%M')
# 判断应该选择哪一列的数据
if '08:00' <= now_time <= '19:00':
column = 7
value = 'D'
else:
column = 7
value = 'N'
# 遍历第三列,将符合条件的数据存储在字典中
data_dict = defaultdict(list)
for row in wb2[sheet_name].iter_rows(min_row=2, min_col=3, max_col=3):
if row[0].value == datetime.datetime.now().strftime('%Y-%m-%d'):
data_dict[row[0].value].append([cell.value for cell in row])
# 预处理列表1和列表2的数据
sheet_names_set = set(sheet_names)
data_list = []
for sheet_name in sheet_names:
if sheet_name in data_dict:
data_list.append((sheet_name, data_dict[sheet_name], True))
else:
data_list.append((sheet_name, [], False))
# 遍历列表1,查找相应的数据并进行处理
for sheet_name, data, flag in data_list:
if flag:
result = '已点检'
else:
result = '未点检'
# 在列表1相应数据后面写上已点检或未点检
wb1[sheet_name].cell(row=1, column=2).value = result
# 将列表1的数据显示在列表框中
self.unique_listbox.delete(0, tk.END)
for sheet_name, _, _ in data_list:
self.unique_listbox.insert(tk.END, sheet_name + ' ' + wb1[sheet_name].cell(row=1, column=2).value)
# 保存修改后的工作薄1
wb1.save('工作薄1.xlsx')
```
这个优化版本的代码使用了 defaultdict 和 set 等数据结构,可以避免重复循环和多次读写 Excel 文件,从而提高了代码的效率。同时,代码结构更加清晰,易于理解和维护。