Python读取txt文件循环异常:卡牌收集程序遍历失效
文本卡牌游戏收藏功能代码问题排查与修复
核心问题分析
你遇到的两个问题本质是文件读写逻辑错误和循环执行条件不满足:
- 无论卡牌是否存在都覆盖为
1* 卡牌名称加空行:说明代码直接使用写入模式清空了原文件,没有先读取并保留原有收藏内容。 - 标记的for循环不执行:大概率是读取收藏文件时没有正确获取有效行,或者文件不存在时直接跳过了读取逻辑,导致循环没有可遍历的内容。
常见错误点排查
- 文件打开模式错误:如果使用
open(..., 'w')会直接清空文件内容,应该先以'r'模式读取现有内容,处理后再以'w'模式写入新内容。 - 读取内容未处理:读取文件时没有过滤空行或去除换行符,导致列表为空或全是无效行,循环自然不会执行。
- 卡牌匹配逻辑漏洞:判断卡牌是否存在时,没有处理字符串中的空格、换行符,导致明明存在的卡牌被判定为不存在。
- 目录未初始化:如果
collections目录不存在,打开文件时会报错,部分代码可能会直接跳过读取逻辑,转而写入错误内容。
修复后的代码示例
import random import os # 从cards.txt随机抽取有效卡牌 with open('cards.txt', 'r', encoding='utf-8') as card_file: # 过滤空行并去除每行的换行符 valid_cards = [line.strip() for line in card_file if line.strip()] if not valid_cards: print("cards.txt中没有可抽取的有效卡牌") exit() selected_card = random.choice(valid_cards) username = "test_user" # 替换为实际用户名 collection_file_path = f"collections/{username}.txt" # 确保收藏目录存在,避免文件打开失败 os.makedirs('collections', exist_ok=True) # 读取现有收藏数据,转为字典便于操作 collection_data = {} if os.path.exists(collection_file_path): with open(collection_file_path, 'r', encoding='utf-8') as coll_file: for line in coll_file: cleaned_line = line.strip() # 跳过空行和格式错误的行 if not cleaned_line or '* ' not in cleaned_line: continue # 解析数量和卡牌名称 count_str, card_name = cleaned_line.split('* ', 1) try: count = int(count_str) collection_data[card_name] = count except ValueError: # 跳过格式错误的行(比如数量不是数字) continue # 更新收藏数据 if selected_card in collection_data: collection_data[selected_card] += 1 else: collection_data[selected_card] = 1 # 将更新后的数据写入收藏文件 with open(collection_file_path, 'w', encoding='utf-8') as coll_file: for card, cnt in collection_data.items(): coll_file.write(f"{cnt}* {card}\n")
代码说明
- 卡牌抽取:先过滤
cards.txt中的空行,确保抽取的是有效卡牌名称。 - 目录初始化:用
os.makedirs确保collections目录存在,避免文件打开失败。 - 收藏读取:将现有收藏转为字典,方便快速判断卡牌是否存在,同时过滤空行和格式错误的行。
- 数据更新:直接操作字典修改数量,逻辑清晰不易出错。
- 文件写入:将字典内容按指定格式写入,不会产生多余空行。
内容的提问来源于stack exchange,提问作者NoviceEverything
相关产品推荐
相关产品推荐

