如何使用Python解析字符串并将数据填充至对应变量
实现步骤与代码示例
1. 核心思路
先从结构化字符串中提取原始键值对,再通过键名映射将原始字段名转换为你需要的变量名,最后根据指定类型完成转换,最终输出为JSON或XML。
2. 具体代码实现
第一步:解析原始字符串
把输入的字符串按行分割,过滤空行和区块标题,提取所有Key: Value格式的键值对:
sample_text = """ EMPLOYEE INFORMATION Name: EmployeeName Employee Type: Salaried/Hourly Department: DepartmentName Department Number: 123 Employee Title: EmployeeTitle Supervisor Name: SupervisorName FACILITIES INFORMATION Location: OfficeLocation SECURITY INFORMATION Access card required?: True Copy access card from: CopyFromUser Elevated access justification: False """ def parse_raw_text(text): raw_data = {} # 分割行并过滤空行 lines = [line.strip() for line in text.split("\n") if line.strip()] for line in lines: if ":" not in line: # 跳过不带冒号的区块标题行 continue # 分割键和值(只分割第一个冒号,避免值里有冒号的情况) raw_key, raw_value = line.split(":", 1) raw_data[raw_key.strip()] = raw_value.strip() return raw_data # 得到原始键值对字典 parsed_raw = parse_raw_text(sample_text)
第二步:键名映射与类型转换
定义两个映射表:一个把原始字段名转成你需要的变量名,另一个指定每个变量的转换规则(处理字符串、整数、布尔值):
# 原始字段名 -> 目标变量名的映射 key_mapping = { "Name": "EmployeeName", "Department": "DepartmentName", "Access card required?": "AccessCardRequired", "Department Number": "DepartmentNumber" } # 目标变量名 -> 类型转换规则的映射 # 布尔值处理:假设原始值是True/False或Yes/No,可根据实际情况修改判断条件 type_converters = { "EmployeeName": str, "DepartmentName": str, "AccessCardRequired": lambda val: val.lower() in ("true", "yes"), "DepartmentNumber": int } final_data = {} for raw_key, target_key in key_mapping.items(): # 处理字段缺失的情况,可根据需求改为抛出异常 if raw_key not in parsed_raw: final_data[target_key] = None continue raw_value = parsed_raw[raw_key] converter = type_converters[target_key] try: final_data[target_key] = converter(raw_value) except ValueError: # 转换失败时保留原始值,或改为设为None final_data[target_key] = raw_value # 查看转换后的结果 print(final_data) # 输出示例: # {'EmployeeName': 'EmployeeName', 'DepartmentName': 'DepartmentName', 'AccessCardRequired': True, 'DepartmentNumber': 123}
第三步:输出为JSON或XML
基于转换后的字典,直接用Python标准库输出为目标格式:
输出JSON
import json with open("employee_data.json", "w", encoding="utf-8") as f: json.dump(final_data, f, indent=2, ensure_ascii=False)
输出XML
import xml.etree.ElementTree as ET # 创建根节点 root = ET.Element("EmployeeData") # 逐个添加子节点 for var_name, var_value in final_data.items(): child_node = ET.SubElement(root, var_name) child_node.text = str(var_value) # 写入XML文件 tree = ET.ElementTree(root) tree.write("employee_data.xml", encoding="utf-8", xml_declaration=True)
3. 扩展说明
- 如果原始字符串中的布尔值是其他格式(比如
Y/N),修改type_converters里的lambda判断条件即可。 - 可以根据需要扩展
key_mapping和type_converters,加入更多字段(比如EmployeeType、Location等)。 - 若需要处理更复杂的格式异常(比如重复键、值为空),可以在解析和转换步骤中添加额外的错误处理逻辑。
内容的提问来源于stack exchange,提问作者sendouwtech
相关产品推荐
相关产品推荐

