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
相关产品推荐
相关产品推荐

