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
相关产品推荐
相关产品推荐

