如何使用Python/Pandas将键值对格式非CSV文本转换为CSV文件
问题根因
你原来的代码报错核心原因是用冒号作为全分隔符读取文件,只要行内冒号数量超过1个(比如Buyer字段值里自带冒号),pandas就会判定字段数不符合预期,直接跳过该行。跳行后4个字段的对应顺序被打乱,自然出现Buyer字段数据错位、缺失的问题。
解决方案
不要直接用pd.read_csv按冒号分隔读取,改为先逐行读取文件内容,仅拆分每行的第一个冒号(字段名和值的分隔固定是第一个冒号,后续冒号都属于字段值内容),再按规则拼接成结构化数据,完全可以避免特殊字符的干扰。
完整可运行代码
import pandas as pd # 存储所有结构化后的完整记录 all_records = [] # 临时存储单条正在处理的记录 current_record = {} # 读取原始文本文件,路径前加r防止Windows路径转义报错 with open(r'C:\File Path\test.txt', 'r', encoding='utf-8') as f: for line in f: # 清除每行首尾的空格、换行符、多余HTML标签(如果有的话) line = line.strip().replace('<br />', '').replace('<br/>', '') # 跳过空行 if not line: continue # 仅拆分第一个冒号,参数1表示最多拆分1次 key, value = line.split(':', 1) # 清除字段名和值的首尾空格 key = key.strip() value = value.strip() current_record[key] = value # 凑齐4个字段说明单条记录读取完成 if len(current_record) == 4: all_records.append(current_record) # 清空临时变量准备读取下一条记录 current_record = {} # 直接转换为DataFrame df = pd.DataFrame(all_records) # 导出为CSV,设置encoding=utf-8-sig保证中文不乱码,index=False去掉多余的索引列 df.to_csv(r'C:\File Path\output.csv', index=False, encoding='utf-8-sig')
关键逻辑说明
split(':', 1)是解决冒号冲突的核心:比如遇到Buyer: Jake and Bob: Owner%LLC: Inc这类内容,拆分后得到的键是Buyer,值是Jake and Bob: Owner%LLC: Inc,完全保留了Buyer字段的原始内容,不会触发字段数错误。- 逻辑全程没有跳行、没有透视补空操作,不会出现字段错位问题,新手也能轻松调整。
内容的提问来源于stack exchange,提问作者SupaDupa
相关产品推荐
相关产品推荐

