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

Python中使用for循环写入文本文件时文件为空的问题求助

解决Random Word Generator中randomwords.txt始终为空的问题

看起来你的代码有几个关键问题导致文件写入失败,我来一步步帮你排查和修复:

1. 条件判断的语法错误(最可能的直接原因)

你触发生成逻辑的条件写得有问题:

if event == 'Gen' and int(values['num'] < 100):

这里的values['num']是字符串类型,你先做了字符串与整数的错误比较(values['num'] < 100),再把布尔结果转成整数。这会导致两个问题:

  • 字符串和整数的比较逻辑不符合预期(比如'10' < '9'会返回True,因为字符串按字符ASCII值比较)
  • 当输入的数字≥100时,values['num'] < 100是False,转成int后为0,条件不成立,根本不会执行生成代码

修正为正确的整数比较:

if event == 'Gen' and int(values['num']) < 100:

2. 文件未正确关闭,缓冲区未刷新

你直接用open()打开文件后没有调用close(),Python的文件缓冲机制可能导致内容还没写入磁盘,程序就结束了。推荐使用with语句,它会自动在代码块结束后关闭文件,确保内容写入:

# 替换原来的文件打开代码
with open('C:.../randomwords.txt', 'w') as randomletterfile:
    print('Searching.....')
    match_count = 0  # 新增计数器,方便调试是否找到匹配单词
    for word in dictionary.dict:
        if word in letterString and len(word) > 3:
            randomletterfile.write(word + '\n')  # 加换行符,避免单词连在一起
            words.append(word)
            print(word, end=', ')
            match_count +=1
    print(f"\n找到 {match_count} 个符合条件的单词")  # 调试输出,确认是否有匹配

3. 潜在的索引错误风险

当words列表为空时(比如没有匹配到任何单词),执行words[random.randint(0, len(words))]会直接报错。建议添加非空判断:

displayedWords = []
if words:  # 只有当words非空时才执行随机选取
    for _ in range(numWords):
        # 注意randint的上限是len(words)-1,因为列表索引从0开始
        displayedWords.append(words[random.randint(0, len(words)-1)])
else:
    displayedWords = ["没有找到符合条件的单词"]
window['words'].update('\n'.join(displayedWords))  # 用换行符分隔显示,更清晰

修复后的完整代码

import random
import dictionary
import PySimpleGUI as sg

letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

layout = [[sg.Spin(values=[x for x in range(1, 100)], initial_value=1, key='num')],
          [sg.Button('Generate', key='Gen')],
          [sg.Text(text='', size=(10, 1), justification='center', key='textbox', enable_events=True)],
          [sg.Text(text='Words will appear here', key='words', size=(50, 20))]]

window = sg.Window('Random Word Generator', layout, size=(400, 300))

while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break
    # 修正条件判断的语法错误
    if event == 'Gen' and int(values['num']) < 100:
        numWords = int(values['num'])
        letterString = ''
        words = []
        for i in range(100000):
            ran = random.randint(0, 25)
            letterString += letters[ran]
        print(letterString)
        # 使用with语句管理文件,自动关闭
        with open('C:.../randomwords.txt', 'w') as randomletterfile:
            print('Searching.....')
            match_count = 0
            for word in dictionary.dict:
                if word in letterString and len(word) > 3:
                    randomletterfile.write(word + '\n')
                    words.append(word)
                    print(word, end=', ')
                    match_count +=1
            print(f'\n找到 {match_count} 个符合条件的单词')
        # 处理words为空的情况,避免索引错误
        displayedWords = []
        if words:
            for _ in range(numWords):
                displayedWords.append(words[random.randint(0, len(words)-1)])
        else:
            displayedWords = ["没有找到符合条件的单词"]
        print(f'\nNumber of random words generated: {len(words)}')
        # 用换行符分隔显示单词
        window['words'].update('\n'.join(displayedWords))

window.close()  # 记得关闭窗口

额外排查点

  • 确认dictionary.dict里确实包含长度大于3的小写英文单词(因为你的letterString全是小写)
  • 检查文件路径'C:.../randomwords.txt'是否正确,建议替换成完整绝对路径(比如'C:/Users/YourName/Documents/randomwords.txt'),避免路径解析问题

内容的提问来源于stack exchange,提问作者Hazen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 12:27:48