使用openpyxl按列名读取Excel及动态存储设备数据方案咨询
问题1 按列名读取Excel值的实现
你可以先读取表头行生成「列名-列索引」的映射字典,后续直接通过列名拿索引取值,完全不受列位置变动影响,具体实现如下:
# 你的数据从第19行开始,默认表头是第18行,可根据实际情况修改行号 header_row = [cell.value for cell in assets_tab[18]] # 生成列名到索引的映射,自动过滤空表头 col_map = {col_name: idx for idx, col_name in enumerate(header_row) if col_name} # 后续遍历数据行时直接通过列名取值 for row in assets_tab.iter_rows(min_row=19, min_col=3, max_col=50): # 直接用列名取对应值,列位置变更也不会报错 hostName = row[col_map["Hostname"]].value
注意:如果表头可能存在大小写不一致、首尾空格的情况,可以在生成col_map的时候统一对列名做去空格、转小写处理,避免匹配失败。
问题2 数据存储方案说明
你看到的用字典存单条设备数据的思路是完全合适的,但是不需要动态生成device1、device2这类独立变量,你的报错就是因为Python不支持直接给device+count这种运算表达式赋值,就算用特殊方法实现了动态变量名,后续遍历、查找数据也非常麻烦。
最优的轻量方案是用列表嵌套字典存储所有设备数据,实现代码如下:
# 初始化空列表存所有设备 devices = [] for row in assets_tab.iter_rows(min_row=19, min_col=3, max_col=50): # 单条设备数据存成字典 device = { "hostName": row[col_map["Hostname"]].value, # 后续可继续加其他字段,比如IP、位置等 # "ip": row[col_map["IP Address"]].value } # 把设备加入列表,自动按顺序存储,不需要手动计数 devices.append(device) # 后续使用示例 # 取第1台设备的主机名:print(devices[0]["hostName"]) # 遍历所有设备:for dev in devices: print(dev["hostName"])
如果后续需要做复杂的筛选、统计、导出操作,也可以直接把这个列表转成Pandas的DataFrame使用,不用修改现有数据生成逻辑。
内容的提问来源于stack exchange,提问作者ChadDa3mon
相关产品推荐
相关产品推荐

