Windows下使用Python获取WiFi信息写入文件如何避免重复追加?
WiFi扫描去重存储实现方案
原有代码问题梳理
- 逻辑顺序错误:先将扫描结果追加写入文件,再做重复判断,完全颠倒了校验逻辑
strip()方法使用错误:str.strip()返回处理后的新字符串,不会修改原变量,原有判断逻辑完全无效- 去重颗粒度过大:直接对比整段扫描输出,没有拆分单个WiFi条目,无法实现单条WiFi去重
- 缺少循环执行逻辑,无法持续扫描
修复后可运行代码
import subprocess import time import re # 存储已记录的WiFi BSSID,BSSID为每个WiFi热点的唯一物理标识 exist_bssids = set() output_path = "output.txt" # 首次启动读取已存储的BSSID try: with open(output_path, "r", encoding="utf-8") as f: content = f.read() # 正则匹配所有已存的BSSID exist_bssids = set(re.findall(r"BSSID\s+\d+\s*:\s*([0-9a-fA-F:]+)", content)) except FileNotFoundError: # 文件不存在就创建空文件 open(output_path, "w", encoding="utf-8").close() identify = "Windows" # 保留原有系统判断逻辑即可 scan_interval = 10 # 扫描间隔,单位可自行调整 while True: if identify == "Windows": cmd = ["netsh", "wlan", "show", "networks", "mode=BSSID"] networks = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) output, errors = networks.communicate() # 如果utf-8解码乱码可替换为gbk scan_data = output.decode("utf-8") # 拆分单条WiFi条目 ssid_blocks = re.split(r"(SSID\s+\d+\s*:)", scan_data) # 跳过开头的接口汇总信息 for i in range(1, len(ssid_blocks), 2): full_block = ssid_blocks[i] + ssid_blocks[i+1] # 提取当前条目的BSSID bssid_match = re.search(r"BSSID\s+\d+\s*:\s*([0-9a-fA-F:]+)", full_block) if not bssid_match: continue current_bssid = bssid_match.group(1).strip() # 未记录过的热点才写入文件 if current_bssid not in exist_bssids: with open(output_path, "a", encoding="utf-8") as f: f.write(full_block + "\n" + "-"*50 + "\n") exist_bssids.add(current_bssid) print(f"新热点已记录:{current_bssid}") # 等待下一次扫描 time.sleep(scan_interval)
关键实现说明
- 用BSSID作为去重依据:每个WiFi热点的BSSID是唯一的物理地址,不会出现重复误判
- 集合存储已存BSSID:查询速度快,适合高频扫描的去重场景
- 拆分单条WiFi条目存储:每个热点单独拆分后写入,避免整段重复存储
- 自动兼容首次运行:没有output.txt文件时会自动创建
内容的提问来源于stack exchange,提问作者SwitchBlade
相关产品推荐
相关产品推荐

