You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Python代码生成精确数量的输出结果?

解决Python代码无法稳定生成精确数量域名的问题

问题根源

  1. 文件写入未同步:原代码中打开文件后持续写入,但未显式关闭或刷新缓冲区,后续读取时部分内容可能仍滞留在内存中未写入磁盘,导致读取到的数量少于实际生成值。
  2. 循环逻辑的潜在风险:虽然外层循环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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 00:20:47