如何让Python代码生成精确数量的输出结果?
解决Python代码无法稳定生成精确数量域名的问题
问题根源
- 文件写入未同步:原代码中打开文件后持续写入,但未显式关闭或刷新缓冲区,后续读取时部分内容可能仍滞留在内存中未写入磁盘,导致读取到的数量少于实际生成值。
- 循环逻辑的潜在风险:虽然外层循环500次、内层循环4次理论上应生成2000条,但如果生成过程中出现异常(比如
random.sample的参数问题,但此处web列表长度为11,subdomain_count最大为4,不会触发错误),不过核心问题还是文件IO的同步问题。
修改方案
方案1:用with语句管理文件写入(自动同步)
使用with语句打开文件,会在代码块结束时自动关闭文件并刷新缓冲区,确保所有内容写入磁盘后再进行读取:
import random delimiters = ['', '-', '.'] suffix = ['co.id', 'info', 'id', 'com', 'odoo', 'xyz', 'de', 'fans', 'blog', 'io', 'site', 'online', 'one'] web = ['auth', 'access', 'account', 'admin', 'agree', 'blue', 'business', 'cdn', 'confirm', 'confirmation', 'enroll'] missed = ['minecraft', 'm1necraft', 'min3craft', 'm1necr4ft', 'min3cr4ft'] # with语句自动处理文件关闭与缓冲区刷新 with open("dictionaries/Website.txt", 'w', encoding="utf-8") as Website: for _ in range(500): for subdomain_count in [1, 2, 3, 4]: pl = random.choice(missed) data = [pl] + random.sample(web, k=subdomain_count) random.shuffle(data) delims = (random.choices(delimiters, k=subdomain_count) + ['.' + random.choice(suffix)]) address = ''.join([a+b for a, b in zip(data, delims)]) weburl = 'http://' + address Website.write(weburl+'\n') # 此时文件已完全写入磁盘,读取结果准确 with open("dictionaries/Website.txt", encoding="utf-8") as f: WebPhishing = [line.rstrip() for line in f] print(len(WebPhishing)) # 稳定输出2000
方案2:先收集所有结果再写入(更严谨)
先将所有生成的域名存入列表,提前验证数量正确性后再一次性写入文件,彻底规避IO同步问题:
import random delimiters = ['', '-', '.'] suffix = ['co.id', 'info', 'id', 'com', 'odoo', 'xyz', 'de', 'fans', 'blog', 'io', 'site', 'online', 'one'] web = ['auth', 'access', 'account', 'admin', 'agree', 'blue', 'business', 'cdn', 'confirm', 'confirmation', 'enroll'] missed = ['minecraft', 'm1necraft', 'min3craft', 'm1necr4ft', 'min3cr4ft'] output = [] for _ in range(500): for subdomain_count in [1, 2, 3, 4]: pl = random.choice(missed) data = [pl] + random.sample(web, k=subdomain_count) random.shuffle(data) delims = (random.choices(delimiters, k=subdomain_count) + ['.' + random.choice(suffix)]) address = ''.join([a+b for a, b in zip(data, delims)]) weburl = 'http://' + address output.append(weburl) # 提前验证数量,生成过程出错直接抛出断言 assert len(output) == 2000, f"生成数量错误:{len(output)} != 2000" # 一次性写入文件 with open("dictionaries/Website.txt", 'w', encoding="utf-8") as Website: Website.write('\n'.join(output) + '\n') # 读取验证 with open("dictionaries/Website.txt", encoding="utf-8") as f: WebPhishing = [line.rstrip() for line in f] print(len(WebPhishing)) # 稳定输出2000
额外说明
- 方案2通过提前收集结果并验证数量,能在写入前就发现生成逻辑的问题,比方案1更严谨。
- 如果需要避免重复域名,可以在收集结果时使用
set去重,但需注意去重后数量会减少,需调整循环逻辑补充缺失的条目。
内容的提问来源于stack exchange,提问作者TheBotHunter
相关产品推荐
相关产品推荐

