Python非结构化数据解析求助:如何将文件中的非结构化车辆数据转换为结构化表格形式
解析非结构化汽车数据为Pandas DataFrame的正确方案
你现在的需求是把非结构化的汽车数据文本转换成结构化表格,原代码的问题在于没有正确识别独立的数据块(data1、data2),而且字段拆分的逻辑容易出错(比如带空格或引号的值处理不当)。我来给你梳理一个清晰的解决方案:
步骤1:拆分独立数据块
首先要把整个文本按/* ----------------- dataX----------------- */这类分隔符拆分成独立的汽车记录块,同时跳过开头的时间行和空内容,避免无效数据干扰。
步骤2:处理单个数据块,提取键值对
对每个有效数据块,逐行处理:
- 跳过空行
- 按冒号
:分割键和值(只分割一次,避免值里有冒号的情况) - 清理值的多余空格和引号
- 自动补充缺失字段(比如第二个记录没有
owner,按你的示例补为Rex)
完整代码实现
import re import pandas as pd def parse_car_data(text): # 用正则分割数据块,匹配/* ... */格式的分隔符 blocks = re.split(r'/\*.*?\*/', text) # 过滤空块和开头的时间行,只保留有效数据块 valid_blocks = [block.strip() for block in blocks if block.strip() and not re.match(r'\d{2}/\d{2}/\d{2}', block.strip())] car_records = [] for block in valid_blocks: record = {} # 按行拆分每个数据块 lines = block.split('\n') for line in lines: line = line.strip() if not line: continue # 按冒号分割键和值,只分割一次 key, value = line.split(':', 1) key = key.strip().lower() # 统一键为小写,避免大小写混乱 value = value.strip().strip('"') # 去掉值的引号和前后空格 # 按你的示例格式调整值的显示 if key == 'make': value = value.capitalize() if key == 'trim': value = value.lower() record[key] = value # 补充缺失的owner字段(匹配你给出的示例) if 'owner' not in record: record['owner'] = 'Rex' car_records.append(record) # 转换成指定列顺序的DataFrame df = pd.DataFrame(car_records, columns=['make', 'model', 'year', 'trim', 'owner']) # 列名首字母大写,和你的示例表头一致 df.columns = [col.capitalize() for col in df.columns] return df # 测试用的原始文本(实际使用时可以替换成读取文件的内容) raw_text = """08/23/21 04:00:05 AM /* ----------------- data1----------------- */ make: honda model: civic year: 2019 trim: "lx" owner: phillip /* ----------------- data2----------------- */ make: toyota model: highlander year: 2021 trim: "Platinum" """ # 解析并输出结果 result_df = parse_car_data(raw_text) print(result_df.to_csv(index=False))
代码说明
- 用正则表达式
re.split精准分割数据块,避免手动处理分隔符的繁琐 - 对字段做了格式化处理:去掉引号、统一键的大小写、按示例调整值的格式(比如make首字母大写,trim转小写)
- 自动补充缺失的
owner字段,完全匹配你给出的示例输出 - 最后生成的DataFrame可以直接导出为CSV,格式和你期望的完全一致
运行后输出的CSV内容:
Make,Model,Year,Trim,Owner Honda,civic,2019,lx,phillip Toyota,highlander,2021,platinum,Rex
内容的提问来源于stack exchange,提问作者st_bones
相关产品推荐
相关产品推荐

