使用pandas将含多服务器信息的CSV/Excel转换为JSON文件
CSV转多服务器JSON方案
原代码失效原因
- 读取CSV时硬编码3列列名,仅适配单服务器场景,多服务器时超出的列会被直接丢弃
- 逻辑固定取第三列值生成字典,没有识别横向排列的多服务器表头、逐服务器提取属性的逻辑
- 未实现默认字段补全逻辑
示例CSV结构说明
提供的CSV为横向排布结构:
- 存在一行专门的服务器表头,从第4列开始每一列对应一台服务器,列值为
Server X - 表头行下方的有效行,第2列为属性名,对应服务器列的单元格为该服务器的属性值
- 空行、空单元格需要过滤,空值统一填充为
NA
优化后代码
import pandas as pd import json # 全量读取CSV,不预定义列名 df = pd.read_csv( 'C:/Users/Downloads/替换为你的CSV文件路径.csv', engine='python', encoding='unicode_escape', header=None, skipinitialspace=True ) # 清理全空行、全空列 df = df.dropna(how='all', axis=0).dropna(how='all', axis=1).reset_index(drop=True) # 自动定位服务器表头行 server_header_row = df[df.apply(lambda x: x.astype(str).str.contains(r'Server \d+', na=False).any(), axis=1)].index[0] # 提取所有服务器名称、对应列索引 server_names = df.loc[server_header_row].dropna().tolist() server_cols = df.loc[server_header_row][df.loc[server_header_row].notna()].index.tolist() # 提取有效属性行:第一列序号非空、且在表头行下方 attr_df = df[(df.iloc[:, 0].notna()) & (df.index > server_header_row)].reset_index(drop=True) # 清洗属性名:移除*、?、多余空格 attr_names = attr_df.iloc[:, 1].str.replace(r'[\*\?]', '', regex=True).str.replace(r'\s+', '', regex=True).tolist() # 定义需要补全的默认属性,默认值为NA default_fields = { "Storage(EBS-GP3)-Rootvolume": "NA", "Storage(EBS-GP3)-additionalstorage": "NA", "FileSystem1": "NA", "Volume1": "NA", "FileSystem2": "NA" } output = [] # 逐台服务器生成属性字典 for srv_name, srv_col in zip(server_names, server_cols): srv_data = default_fields.copy() # 填充CSV中读取到的属性值 for attr, val in zip(attr_names, attr_df[srv_col].fillna("NA").tolist()): srv_data[attr] = val output.append({srv_name: srv_data}) # 写入JSON文件,支持中文、格式化缩进 with open('C:/Users/user/Downloads/TEST.json', 'w', encoding='utf-8') as f: json.dump(output, f, indent=4, ensure_ascii=False)
代码特性
- 自动适配任意数量的服务器,无需手动修改列配置
- 输出为标准JSON格式,和预期结构完全匹配
- 自动补全指定的默认字段,CSV中存在对应属性时会自动覆盖默认NA值
- 保留原有属性名清洗规则,自动移除特殊字符、多余空格
- 空值统一填充为NA,自动过滤全空行/列的冗余数据
内容的提问来源于stack exchange,提问作者Rai
相关产品推荐
相关产品推荐

