使用Python pandas读取txt文件按规则拆分列导出指定格式csv
问题说明
使用pandas读取SVN权限配置中[groups]段的txt文件,原始文件格式为组名 = 逗号分隔用户名列表,需要将其转换为用户名 = 所属组名格式的csv,首行固定为groups,第二行为空行。
原始输入示例:
[groups] admins = user1,user2,user3 users_network = user4,user5 users_m4s = user6,user7,user8,user9
预期输出示例:
groups user1 = admins user2 = admins user3 = admins user4 = users_network user5 = users_network user6 = users_m4s user7 = users_m4s user8 = users_m4s user9 = users_m4s
原代码存在以下问题:
- 未跳过开头的
[groups]标记行,读入数据第一行为无效内容 - 未对逗号分隔的用户名列表做拆分展开,所有用户名挤在同一列
- 未做组名到用户名的映射反转,输出逻辑和需求完全不匹配
- Windows路径未做转义处理,容易出现路径识别错误
- 冗余导入numpy库,整个流程不需要依赖numpy
正确实现代码
import pandas as pd # 路径前加r标记为原始字符串,避免反斜杠转义问题 input_file = r"D:\GIT-files\Automate-Stats\SVN_sample_files\sample_svn_input.txt" output_file = r"D:\GIT-files\Automate-Stats\SVN_sample_files\sample_svn_input_update.csv" # 读入组配置,跳过第一行[groups]标记 df = pd.read_table( input_file, sep="=", engine="python", skiprows=1, names=["group_name", "user_list"], skipinitialspace=True # 自动忽略分隔符前后的空格 ) # 拆分逗号分隔的用户名,展开为每个用户单独一行 df["user_name"] = df["user_list"].str.split(",") df = df.explode("user_name") # 清理字段前后的空格、换行残留 df = df.applymap(lambda x: x.strip() if isinstance(x, str) else x) # 按要求拼接每行输出内容 output_rows = df.apply(lambda x: f"{x['user_name']} = {x['group_name']}", axis=1).to_list() # 按指定格式写入文件 with open(output_file, "w", encoding="utf-8") as f: f.write("groups\n\n") f.write("\n".join(output_rows)) # 验证输出结果 print(pd.read_table(output_file, sep="=", skiprows=2, names=["用户名", "所属组"], skipinitialspace=True))
关键逻辑说明
- 读入阶段直接跳过无效的
[groups]头行,通过skipinitialspace参数自动处理等号前后的空格,减少后续清洗工作量 - 用pandas的
str.split+explode组合实现列表拆分展开,比手写循环效率更高,代码更简洁 - 没有直接用
df.to_csv默认导出,因为需求要求第二行为空行,默认导出方法无法灵活控制行结构,直接按规则写文件兼容性更好 - 所有字符串字段统一做strip处理,避免原始文件里多余的空格、换行符导致匹配错误
内容的提问来源于stack exchange,提问作者Champs
相关产品推荐
相关产品推荐

