Python实现TXT转CSV:多经理与动态字段处理问题求助
解决方案:处理多经理与动态字段的TXT解析
我来给你搞定这个问题,刚好能解决你遇到的两个痛点——多经理字段和动态额外字段,同时生成你要的输出格式。咱们不用死板的read_csv固定分隔,换成逐行解析的方式更灵活:
步骤1:导入依赖库
import pandas as pd import re
步骤2:写一个灵活的行解析函数
这个函数能处理你文件里各种不统一的键值分隔格式(比如: 、:、::甚至:),还能自动把重复的manager字段收集成列表:
def parse_line(line): # 正则匹配所有键值对:兼容各种冒号分隔格式,正确提取带空格的值(比如"building a") pattern = r'(\w+)\s*:[:]?\s*(.*?)(?=\s+\w+\s*:[:]?|$)' matches = re.findall(pattern, line.strip()) result = {} for key, value in matches: key = key.lower() # 统一键为小写,避免大小写混乱 if key in result: # 如果键已存在(比如多个manager),转成列表存储 if not isinstance(result[key], list): result[key] = [result[key]] result[key].append(value) else: result[key] = value return result
步骤3:读取文件并解析所有行
先过滤掉空白行,再逐行解析:
# 读取文件,跳过空行 with open('sample.txt', 'r') as f: lines = [line.strip() for line in f if line.strip()] # 解析每一行数据,得到结构化的字典列表 parsed_data = [parse_line(line) for line in lines]
步骤4:展开多经理条目,生成最终记录
把每个多经理的部门拆成单独行,同时自动处理location这类可选字段(没有就填空字符串):
final_records = [] for item in parsed_data: # 处理经理字段:单个经理转成列表,方便统一循环 managers = item.get('manager', []) if not isinstance(managers, list): managers = [managers] # 每个经理生成一条独立记录 for manager in managers: record = { 'dep': item.get('department', ''), 'group': item.get('group', ''), 'manager': manager, 'Location': item.get('location', '') } final_records.append(record)
步骤5:转成DataFrame
最后把记录列表转成你要的格式:
df = pd.DataFrame(final_records) print(df)
运行后得到的输出就和你期望的完全一致:
dep group manager Location 0 sale building a sergey 1 hr building a tom somewhereelse 2 health building b jeniffer 3 health building b billy
为啥这个方案能解决你的问题?
- 多经理处理:通过正则解析把重复的
manager字段收集成列表,再拆分成多行,完美适配多个经理的场景。 - 动态字段适配:用字典存储每行的键值对,不管有没有
location这类额外字段,都能自动填充,不会因为字段缺失报错。 - 兼容格式混乱:正则表达式能处理你文件里各种不统一的键值分隔写法,比固定分隔的
read_csv靠谱多了。
内容的提问来源于stack exchange,提问作者Delimeter Awr
相关产品推荐
相关产品推荐

