如何用itertools生成全密码组合并拆分输出为指定大小文件?
解决方法
首先修正你原代码的核心问题,再实现按3GB拆分输出文件的逻辑:
1. 修正原代码的关键错误
你的代码没有指定itertools.permutations的长度参数,导致生成了所有长度的单词排列(从1个单词到全列表单词的排列),这是文件体积爆炸的主要原因。另外readlines()会保留每行的换行符,需要先清理:
- 读取密码列表时,用
strip()去掉每行的换行和空白字符 - 明确指定
permutations的长度为2,只生成两个单词的有序组合
2. 实现按3GB拆分输出文件
通过跟踪当前输出文件的大小,达到阈值时切换新文件,确保不遗漏任何组合:
完整代码示例
import itertools # 配置参数 PASSWORD_FILE = "passwords.txt" TARGET_SIZE = 3 * 1024 * 1024 * 1024 # 3GB,单位字节 file_counter = 1 current_file = open(f"combinations_{file_counter}.txt", "w", encoding="utf-8") current_size = 0 # 读取并清理密码列表 with open(PASSWORD_FILE, "r", encoding="utf-8") as f: # 过滤空行,清理每行的换行符 password_list = [line.strip() for line in f if line.strip()] # 生成两个单词的有序组合(排列) for pair in itertools.permutations(password_list, 2): # 拼接组合字符串,末尾加换行符 combo = ''.join(pair) + "\n" # 计算当前字符串的字节数(utf-8编码下准确统计) combo_size = len(combo.encode("utf-8")) # 如果写入当前字符串会超过目标大小,切换新文件 if current_size + combo_size > TARGET_SIZE: current_file.close() file_counter += 1 current_file = open(f"combinations_{file_counter}.txt", "w", encoding="utf-8") current_size = 0 # 写入内容并更新当前文件大小 current_file.write(combo) current_size += combo_size # 关闭最后一个文件 current_file.close()
代码说明
- 参数配置:
TARGET_SIZE设置为3GB的字节数,可根据实际需求微调 - 密码列表清理:过滤空行并去除换行符,避免生成带无效换行的组合
- 文件切换逻辑:每次写入前检查当前文件剩余容量,不足则创建新文件继续写入,保证拆分的文件大小接近3GB且无遗漏
- 编码处理:明确指定
utf-8编码,避免跨系统编码问题,同时准确计算字符串的字节占用
可选调整
如果目标密码是不考虑顺序的两个单词组合(即ab和ba视为同一组合),将itertools.permutations替换为itertools.combinations即可,组合数会减少一半,进一步压缩文件体积。
内容的提问来源于stack exchange,提问作者bl0ndnoob
相关产品推荐
相关产品推荐

