Python处理MySQL备份文件:同一行多邮箱混淆重复问题求助
解决SQL备份中多邮箱替换为唯一哈希的问题
问题根源
你的代码里repl函数用了hash(line)——也就是对整行文本计算哈希,所以同一行里所有匹配到的邮箱都会被替换成同一个哈希值,这就是同一行多个邮箱重复的核心原因。
修复思路
让每个匹配到的邮箱生成独立的哈希值,只需要基于当前匹配到的邮箱字符串计算哈希,而不是整行内容。
基础修复版本
修改repl函数,使用match.group()获取当前匹配的邮箱,再对这个字符串计算哈希:
import re with open("dump.sql", "r") as file: lines = file.readlines() def repl(match): # 基于匹配到的邮箱本身计算哈希,确保每个邮箱对应唯一值 email_hash = str(hash(match.group())) return f"-{email_hash}@example.com" new_lines = [] for line in lines: new_lines.append(re.sub(r'([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,})', repl, line)) with open("dump-processed.sql", "w") as file: file.writelines(new_lines)
这个版本会让同一行里的每个邮箱生成各自的哈希,完全符合你的预期输出。
更稳定的哈希方案(可选)
Python内置的hash()函数在不同运行环境(比如不同Python版本、不同进程)中可能生成不同的值,如果需要生成固定不变的哈希值,可以用hashlib库生成MD5/SHA256哈希,取前若干位保证唯一性:
import re import hashlib with open("dump.sql", "r") as file: lines = file.readlines() def repl(match): email = match.group().encode('utf-8') # 生成MD5哈希,转为整数后作为唯一标识 email_hash = int(hashlib.md5(email).hexdigest(), 16) return f"-{email_hash}@example.com" new_lines = [] for line in lines: new_lines.append(re.sub(r'([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,})', repl, line)) with open("dump-processed.sql", "w") as file: file.writelines(new_lines)
效果验证
修复后,你的样例数据会输出:
INSERT INTO `users` VALUES ('john','-5196869426929071700@example.com','\0'),('kate','-7140769694376981046@example.com','\0'), INSERT INTO `users` VALUES ('peter','-4574418619379266923@example.com','\0'),
每个邮箱都有独立的唯一哈希,满足UNIQUE索引的要求。
内容的提问来源于stack exchange,提问作者Soundcheck
相关产品推荐
相关产品推荐

