按照這個需求重新修改代碼,避免重复读取文件,提高数据读取效率。可以考虑将数据拆分成多个文件进行处理,以避免单个文件过大导致的性能问题。
时间: 2024-03-26 20:39:50 浏览: 37
java IO流将一个文件拆分为多个子文件代码示例
好的,针对这个需求,可以对代码进行如下修改:
1. 将文件读取操作提取出来,放在函数外部,只在需要读取时再进行调用,避免重复读取文件。
2. 考虑将数据拆分成多个文件进行处理,以避免单个文件过大导致的性能问题。可以按照日期拆分文件,每个文件只包含某一天的数据。
具体的代码修改如下:
```python
import os
import datetime
import openpyxl as xl
import tkinter as tk
class MyGUI:
def __init__(self):
self.unique_listbox = tk.Tk()
self.sheet_names = ['Sheet1', 'Sheet2', 'Sheet3']
self.dir_path = 'data' # 存放数据的目录
# 读取所有数据文件的文件名并保存
self.data_files = {}
for name in os.listdir(self.dir_path):
if name.endswith('.xlsx'):
date_str = name.split('.')[0]
date = datetime.datetime.strptime(date_str, '%Y-%m-%d').date()
self.data_files[date] = os.path.join(self.dir_path, name)
self.refresh_labels()
def read_data(self, date, sheet):
if date not in self.data_files:
return []
filepath = self.data_files[date]
workbook = xl.load_workbook(filepath)
sheet = workbook[sheet]
today = datetime.date.today().strftime('%Y/%m/%d')
filtered_rows = []
for row in sheet.iter_rows(min_row=1):
if row[2].value == today and row[8].value == sheet_name:
datetime_obj = datetime.datetime.strptime(row[3].value, '%H:%M:%S')
row_time = datetime_obj.time()
current_time = datetime.datetime.now().time()
start_time_1 = datetime.time(8, 0, 0) # 早上8点
end_time_1 = datetime.time(20, 0, 0) # 下午7点
start_time_2 = datetime.time(20, 0, 0) # 晚上8点
end_time_2 = datetime.time(7, 0, 0) # 早上7点
if start_time_1 <= row_time <= end_time_1 and start_time_1 <= current_time <= end_time_1:
filtered_rows.append(row)
elif start_time_2 <= row_time or current_time <= end_time_2:
filtered_rows.append(row)
return filtered_rows
def refresh_labels(self):
for i, sheet_name in enumerate(self.sheet_names):
filtered_rows = []
for date in self.data_files:
filtered_rows.extend(self.read_data(date, sheet_name))
label = self.unique_listbox.grid_slaves(row=i // 3, column=i % 3)[0]
if filtered_rows:
label.config(text=f"{sheet_name} - 已點檢", fg="green")
else:
label.config(text=f"{sheet_name} - 未點檢", fg="red")
self.unique_listbox.after(60000, self.refresh_labels) # 每分钟刷新一次
def run(self):
self.unique_listbox.mainloop()
gui = MyGUI()
gui.run()
```
这个版本的代码中,`read_data` 方法用于读取特定日期和特定表名的数据行,代码中会先检查对应的数据文件是否存在,如果存在,则读取该文件中的数据,并根据时间范围筛选出需要的行。
在 `refresh_labels` 方法中,我们遍历所有的表名,然后调用 `read_data` 方法读取所有数据文件,并将筛选结果进行合并,最后根据筛选结果更新 GUI 界面上对应的标签文本。
另外,代码中添加了一个定时器,每分钟自动刷新一次界面,以保证数据的及时性。
阅读全文