文件I/O追加唯一随机数失败求助:代码重复写入问题排查
问题分析与解决
原代码出现重复写入的核心问题是类型不匹配导致重复检查完全失效:
- 从文件读取的
lines是字符串列表(比如文件内容是"3 5",split()后得到["3","5"]) - 生成的
num是整数类型,直接用lines != num比较永远为真,等于跳过了重复检查
另外循环条件逻辑混乱,0<=num<=10在初始时成立,但生成num后这个条件始终满足,而i<1只允许写入一次,不符合持续生成唯一数的需求。
修正后的代码
如果需要每次运行程序写入一个1-10之间的唯一数(直到文件填满1-10所有数字),可以这样写:
import random # 读取文件中已有的数字,转为整数集合 try: with open('Rajdhani.txt', 'r') as f: existing_nums = set(map(int, f.read().split())) except FileNotFoundError: # 文件不存在时初始化空集合 existing_nums = set() # 生成1-10中未出现过的随机数 available_nums = [num for num in range(1, 11) if num not in existing_nums] if not available_nums: print("1-10的数字已全部写入文件") else: num = random.choice(available_nums) with open('Rajdhani.txt', 'a') as f: # 写入时加空格,方便后续读取分割 f.write(f"{num} ") print(f"已写入数字: {num}")
关键改动说明
- 类型统一:把读取到的字符串数字转为整数集合,集合的成员检查效率远高于列表,能快速判断数字是否已存在
- 异常处理:处理文件不存在的情况,避免首次运行报错
- 预筛选可用数字:先找出1-10中未写入的数字,再从中随机选择,从根源避免重复
如果需要持续写入直到填满所有数字,可以把生成和写入部分放到循环里:
import random while True: try: with open('Rajdhani.txt', 'r') as f: existing_nums = set(map(int, f.read().split())) except FileNotFoundError: existing_nums = set() available_nums = [num for num in range(1, 11) if num not in existing_nums] if not available_nums: print("所有数字已写入完毕") break num = random.choice(available_nums) with open('Rajdhani.txt', 'a') as f: f.write(f"{num} ") print(f"已写入数字: {num}") # 可添加输入判断是否继续写入 # if input("是否继续?(y/n)").lower() != 'y': # break
内容的提问来源于stack exchange,提问作者Abhiroop Bhattacharjee
相关产品推荐
相关产品推荐

