Python实现跨文本文件比对去重并提取唯一用户名入库
文本比对去重提取用户名解决方案
场景与需求
file1.txt每行格式为username:password,示例内容:admin:2222 admin:meunsm admin:12345 stack:0000 csanders:1111file2.txt每行包含username:password片段,格式为source ip: source port > destination ip: destination port username:password,示例内容:192.168.0.114:1137 > 192.168.0.193:21 csanders:echo
需求:提取file1.txt中用户名未在file2.txt出现过的行对应的用户名,且最终用户名无重复,存入数据库。
原代码问题分析
- 判断逻辑错误:原代码用
if line1 in line2判断,但file1的行是user:pass1,file2里是user:pass2,两者完全不同,导致判断失效,无法正确识别已出现的用户名。 - 无去重机制:直接追加提取的用户名,未处理重复项。
- 文件写入位置错误:写入操作放在外层循环内,导致重复写入内容。
修正后的代码
# 提取file2中所有出现过的用户名(存入集合自动去重) existing_users = set() with open('file2.txt', 'r') as f2: for line in f2: line = line.strip() if not line: continue # 分割行,取最后一段的用户名部分 user_pass = line.split()[-1] username = user_pass.split(':')[0] existing_users.add(username) # 处理file1,筛选未在file2出现的用户名(集合自动去重) target_users = set() with open('file1.txt', 'r') as f1: for line in f1: line = line.strip() if not line: continue username = line.split(':')[0] if username not in existing_users: target_users.add(username) # 写入结果文件 with open('newfile.txt', 'w') as newfile: # 按字母排序输出,可根据需求删除sorted() for user in sorted(target_users): newfile.write(f"{user}\n") # 存入数据库示例(以SQLite为例) import sqlite3 conn = sqlite3.connect('user_db.db') cursor = conn.cursor() # 创建用户表(主键约束保证用户名不重复) cursor.execute('''CREATE TABLE IF NOT EXISTS non_existing_users (username TEXT PRIMARY KEY NOT NULL)''') # 批量插入数据 for user in target_users: try: cursor.execute("INSERT INTO non_existing_users (username) VALUES (?)", (user,)) except sqlite3.IntegrityError: # 用户名已存在时跳过 pass conn.commit() conn.close()
代码关键说明
- 使用**集合(set)**存储用户名:天然实现去重,且成员查询效率远高于列表。
- 正确提取用户名:不管
file2中对应密码是什么,只要用户名出现就标记为已存在。 - 先收集所有目标用户再写入:避免重复写入文件,提升效率。
- 数据库层兜底:通过主键约束再次确保用户名不重复,防止意外重复数据。
内容的提问来源于stack exchange,提问作者AHSAN YAZDANI
相关产品推荐
相关产品推荐

