Python中with open读取文件异常,pyautogui操作Zmodem失效求助
问题排查与修复方案
一、文件读取与匹配逻辑核心错误
- 丢失关键行内容
代码先执行content = file.readline()读取了BOOT.TXT的第一行V100,后续for content in file仅遍历剩余行,导致V100这个核心标识完全没参与判断逻辑。 - 匹配逻辑完全不成立
你将type_100 + V10E + version_21127拼接成一个长字符串,再判断它是否存在于某一行中。但BOOT.TXT里每个标识都是单独一行的,比如V100在第一行、Hardware: 5.01在第五行,这个拼接后的字符串不可能出现在任何一行,所以永远触发不了分支条件。
修复后的文件读取逻辑:
with open('I:\\VT\\N Testing\\Config\\BOOT.TXT', 'r', encoding='utf-8') as file: content = file.read() # 读取文件全部内容 type_100 = 'V100' V10X = 'Hardware: 4.01' V10E = 'Hardware: 5.01' version_21127 = 'Firmware: 2.1.12.7' # 同时检查多个标识是否存在于文件中 if type_100 in content and V10E in content and version_21127 in content: pyautogui.typewrite(r'ZmTest.exe -port:4 -send I:\VT\firmware\2.1.12.7\E\vware.dat') pyautogui.press('return') time.sleep(0.6) elif type_100 in content and V10X in content and version_21127 in content: pyautogui.typewrite(r'ZmTest.exe -port:4 -send I:\VT\firmware\2.1.12.7\X\fware.dat') pyautogui.press('return') time.sleep(0.6)
二、Command Prompt窗口未激活导致指令发送失败
用os.system('start cmd')启动新窗口后,没有确保窗口处于激活状态,pyautogui的按键指令大概率发送到了你的Python IDE或其他窗口,Zmodem根本没收到命令。
修复方案(需先安装pygetwindow:pip install pygetwindow):
import pygetwindow as gw os.system('start cmd') time.sleep(1) # 定位并激活cmd窗口(标题根据系统语言调整,中文为"命令提示符") cmd_windows = gw.getWindowsWithTitle("Command Prompt") if cmd_windows: cmd_window = cmd_windows[0] cmd_window.activate()
三、路径转义字符错误
代码中路径字符串如'cd I:\VT\ZmodemTest'里的\V、\Z会被Python解析为转义字符,导致实际执行的cd命令路径错误,后续启动ZmTest.exe也会失败。
修复方案:
使用原始字符串(前缀加r)或双斜杠表示路径:
# 原始字符串写法(推荐) pyautogui.typewrite(r'cd I:\VT\ZmodemTest') # 或双斜杠写法 pyautogui.typewrite('cd I:\\VT\\ZmodemTest')
四、其他优化点
- 打开文件时显式指定
encoding='utf-8',避免系统默认编码导致的读取乱码; - 变量定义无需额外加括号,比如
type_100 = 'V100'即可,括号完全多余; - 如果只有一个cmd窗口,也可以用
pyautogui.hotkey('alt', 'tab')快速切换激活,作为窗口定位的替代方案。
内容的提问来源于stack exchange,提问作者Naj
相关产品推荐
相关产品推荐

