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

Python检查CSV文件间名称是否存在及代码无输出问题排查

问题排查与修复

代码中的核心问题

  • 缩进错误:第一个嵌套with块内的if "@" in user_line and "." in user_line:语句缩进层级错误,它应该与外层for user_line in sn:同级别,当前缩进会触发语法错误(若实际运行无报错,大概率是粘贴格式问题,但属于潜在bug)。
  • 路径转义问题:Windows路径中的\是转义字符,比如\U会被解析为Unicode转义序列,建议用原始字符串定义路径,比如sn_users_path = r"C:\Users\karlj\Downloads\sn_users.csv",避免路径解析失败。
  • 遍历逻辑错误:第二个代码块中,你先遍历modified_sn的所有行并反复覆盖line变量,最终line仅保留最后一行的用户数据,之后才去检查assigned_to内容,这意味着只会验证最后一个用户是否存在,而非全部用户。
  • 文件读取方式错误:读取modified_assigned_to_path时,直接for names_list in map:会把每行字符串拆分成单个字符遍历,而非解析成列表,需要先将字符串形式的列表转换为实际列表对象。
  • eval的安全性问题:用eval解析文件中的列表字符串存在安全风险,建议改用ast.literal_eval,它能安全解析Python字面量。

修正后的代码

import ast

# 用原始字符串定义路径,避免转义问题
sn_users_path = r"C:\Users\karlj\Downloads\sn_users.csv"
assigned_to_path = r"C:\Users\karlj\Downloads\assigned_to.csv"
modified_sn = "sn_users_path_modified.csv"
modified_assigned_to_path = "assigned_to_path.csv"

# 第一步:处理原始CSV生成modified_sn
with open(sn_users_path, 'r') as sn:
    with open(modified_sn, 'w') as outfile:
        for user_line in sn:
            user_line = user_line.rstrip()
            # 修正缩进
            if "@" in user_line and "." in user_line:
                users = user_line.split('@')
                users[0] = users[0].split(".")
                users[0] = " ".join(users[0]).title()
                if "," in user_line:
                    users[1] = users[1].split(",")
                    outfile.write(str(users) + '\n')
                else:
                    user = user_line.split(",")
                    outfile.write(str(user) + '\n')

# 第二步:读取处理后的文件,检查名称是否存在
# 先收集modified_sn中的所有用户名
sn_names = []
with open(modified_sn, 'r') as msn:
    for line in msn:
        # 用ast.literal_eval替代eval,更安全
        user_data = ast.literal_eval(line.strip())
        sn_names.append(user_data[0])

# 读取modified_assigned_to_path中的名称列表并匹配
with open(modified_assigned_to_path, 'r') as map_file:
    for line in map_file:
        names_list = ast.literal_eval(line.strip())
        # 跳过第一个标识元素"assigned_to_updated"
        for name in names_list[1:]:
            if name in sn_names:
                print(f"找到匹配名称:{name}")

额外优化建议

  • 处理CSV文件优先使用Python内置的csv模块,比手动拆分字符串更可靠,能自动处理逗号分隔、引号包裹等复杂场景。
  • 避免将列表以字符串形式写入文件,可改用JSON格式存储,读取时用json模块解析,比ast.literal_eval更通用。

内容的提问来源于stack exchange,提问作者Iaj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 02:26:21