You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 21:30:41