如何用Python自动化照度计第三方软件的数据采集全流程?
照度计数据采集与处理全流程自动化方案
一、第三方软件UI自动化(PyAutoGUI实现)
针对桌面软件的按钮点击、弹窗操作,PyAutoGUI是最直接的解决方案,核心通过截图匹配或坐标定位完成控件交互:
环境准备
pip install pyautogui pillow
核心操作逻辑
- 控件定位:
- 提前截取软件「开始」「停止」「保存」按钮的清晰截图,命名为
start_btn.png、stop_btn.png、save_btn.png并存放在指定目录 - 用
pyautogui.locateCenterOnScreen()定位按钮中心,调用click()完成点击
- 提前截取软件「开始」「停止」「保存」按钮的清晰截图,命名为
- 采样率设置:点击开始后,弹窗输入
1并按回车确认采样率 - 自动命名与保存:保存弹窗中直接输入递增的文件名(如
test-1),确认保存到桌面
关键代码片段
import pyautogui import time import os DESKTOP_PATH = os.path.join(os.path.expanduser('~'), 'Desktop') BTN_DIR = './btn_screenshots/' TEST_DURATION = 305 # 测试时长留5秒冗余 def get_next_test_id(): # 自动生成递增的test编号 test_files = [f for f in os.listdir(DESKTOP_PATH) if f.startswith('test-') and f.endswith('.txt')] if not test_files: return 1 max_id = max(int(f.split('-')[1].split('.')[0]) for f in test_files) return max_id + 1 def automate_collect(): test_id = get_next_test_id() test_name = f'test-{test_id}' # 点击开始按钮 start_pos = pyautogui.locateCenterOnScreen(os.path.join(BTN_DIR, 'start_btn.png')) if not start_pos: raise ValueError('未找到开始按钮') pyautogui.click(start_pos) time.sleep(1) pyautogui.typewrite('1') pyautogui.press('enter') # 等待采集完成 time.sleep(TEST_DURATION) # 点击停止按钮 stop_pos = pyautogui.locateCenterOnScreen(os.path.join(BTN_DIR, 'stop_btn.png')) if not stop_pos: raise ValueError('未找到停止按钮') pyautogui.click(stop_pos) time.sleep(1) # 点击保存并命名 save_pos = pyautogui.locateCenterOnScreen(os.path.join(BTN_DIR, 'save_btn.png')) if not save_pos: raise ValueError('未找到保存按钮') pyautogui.click(save_pos) time.sleep(2) pyautogui.typewrite(test_name) time.sleep(0.5) pyautogui.press('enter') # 确认保存(需确保默认路径为桌面) return os.path.join(DESKTOP_PATH, f'{test_name}.txt')
二、TXT转指定格式Excel(Pandas实现)
用Pandas快速读取TXT并整理成要求的5列格式,效率远高于原生Excel操作库:
核心逻辑
- 读取TXT原始数据(需根据实际格式调整分隔符与列名)
- 构造指定列:
- 第1列:空值列
- 第2列:从1开始的序列号
- 第3列:提取的Lux数值
- 第4列:固定值
Lux - 第5列:将原始时间转换为
MM-DD-YY/HH:MM:SS格式
- 保存为Excel文件到桌面
代码示例
import pandas as pd from datetime import datetime def txt_to_excel(txt_path, excel_path): # 读取TXT(假设每行格式为:原始时间 Lux值,需根据实际调整) df = pd.read_csv(txt_path, sep='\s+', header=None, names=['raw_time', 'raw_lux']) # 构造目标列 df['空列'] = '' df['序列号'] = range(1, len(df)+1) df['Lux值'] = df['raw_lux'].astype(float) df['单位'] = 'Lux' # 转换时间格式(假设原始时间为YYYY-MM-DD HH:MM:SS) df['时间'] = df['raw_time'].apply(lambda x: datetime.strptime(x, '%Y-%m-%d %H:%M:%S').strftime('%m-%d-%y/%H:%M:%S')) # 按指定顺序保存 output_cols = ['空列', '序列号', 'Lux值', '单位', '时间'] df[output_cols].to_excel(excel_path, index=False)
三、全流程整合与现有脚本复用
将UI自动化、格式转换、数据处理串联为完整流程,同时优化现有处理脚本以适配自动化:
现有脚本优化(支持直接传文件路径)
修改原处理脚本的import_data_from_excel函数,避免手动选择文件:
# 修改原脚本的函数 def import_data_from_excel(file_path=None): if not file_path: file_path = filedialog.askopenfilename(filetypes=[("Excel Files", "*.xlsx")]) if file_path: lux_values.clear() serial_numbers.clear() workbook = openpyxl.load_workbook(file_path) sheet = workbook.active for row in sheet.iter_rows(min_row=2, values_only=True): _, serial_number, lux_value, _, _ = row lux_values.append(lux_value) serial_numbers.append(serial_number) update_graph_and_results()
完整整合代码
import subprocess from your_processing_script import import_data_from_excel, root def main(): # 1. 自动化采集并保存TXT txt_path = automate_collect() # 2. TXT转Excel excel_name = os.path.splitext(os.path.basename(txt_path))[0] + '.xlsx' excel_path = os.path.join(DESKTOP_PATH, excel_name) txt_to_excel(txt_path, excel_path) # 3. 执行数据处理脚本 import_data_from_excel(excel_path) root.mainloop() if __name__ == '__main__': main()
四、稳定性优化建议
- 若PyAutoGUI截图匹配不稳定,可改用
Pywinauto(针对Windows软件,直接定位控件,无需截图) - 添加try-except块捕获异常(如按钮找不到、文件保存失败),并增加重试机制
- 测试时固定软件窗口位置与大小,避免控件坐标偏移
内容的提问来源于stack exchange,提问作者Zaki Aslam
相关产品推荐
相关产品推荐

