Python生成WiFi扫描CSV文件字段错乱问题求助
WiFi扫描CSV字段错乱问题解决
问题背景
公司原有季度WiFi扫描程序迁移至Windows 11后功能失效,使用Python结合pywifi、comtypes库重写后,程序可正常获取WiFi数据并写入CSV文件,但出现字段内容错乱、无法与表头对齐的问题。
错误输出示例:
| BSSID | SSID | Signal | Location | | Home | b0:95:75:46:45:d1 | -36 | Northern Atrium | | Home | b0:95:75:46:45:d2 | Northern Atrium | -62 | | 78:76:89:97:04:e2 | | Western Atrium | -83 | | | -62 | Kimsuezun | Western Atrium |
问题原因
核心错误是写入CSV时使用了无序的集合类型传递数据:
代码中writer.writerow({bssid, ssid, signal, location})一行,集合({})的元素顺序随机且不固定,每次写入时字段顺序会随机变化,无法与表头的固定顺序(BSSID/SSID/Signal/Location)对应,最终导致内容错乱。
解决方案
方法一:改用有序列表传递数据(简单直接)
将集合改为列表([]),列表元素顺序固定,与表头字段严格对应即可:
修改代码中写入行的部分:
# 原错误代码 # writer.writerow({bssid, ssid, signal, location}) # 修改后代码 writer.writerow([bssid, ssid, signal, location])
方法二:使用csv.DictWriter(更规范,适合字段扩展)
如果后续需要调整字段或更清晰地绑定字段与内容,推荐使用csv.DictWriter,通过字典键值对明确对应表头:
修改CSV写入的相关代码:
with io.open('Wifi-Scan.csv', 'w', encoding='utf-8', newline='') as file: fieldnames = ['BSSID', 'SSID', 'Signal', 'Location'] # 初始化DictWriter并指定字段名 writer = csv.DictWriter(file, fieldnames=fieldnames) # 写入表头 writer.writeheader() for network in results: # ...(其他逻辑保持不变) # 用字典绑定字段与数据 writer.writerow({ 'BSSID': bssid, 'SSID': ssid, 'Signal': signal, 'Location': location })
额外优化建议
原代码中match choice的分支逻辑可以用字典映射简化,减少冗余同时处理无效输入:
location_map = { 'N': "Northern Atrium", 'NE': "Northeastern Atrium", 'E': "Eastern Atrium", 'SE': "Southeastern Atrium", 'S': "Southern Atrium", 'SW': "Southwestern Atrium", 'W': "Western Atrium", 'NW': "Northwestern Atrium", 'K': "Kitchen", 'I': "IT Area", 'V': "Vacations", 'T': "Travelstore Area", 'D': "Denise's Office", 'M': "Meetings Area", 'R': "Reception" } # 获取对应位置,输入无效时默认显示"Unknown Location" location = location_map.get(choice.strip().upper(), "Unknown Location")
内容的提问来源于stack exchange,提问作者Niklaus Pegler
相关产品推荐
相关产品推荐

