Python使用with open生成不覆盖的每日游戏数据CSV文件报错求助
解决方案
1. 修复写入权限错误
open()函数默认以**只读模式('r')**打开文件,这是触发io.UnsupportedOperation: not writable错误的核心原因。你需要显式指定写入模式:
'w':覆盖已有文件(不符合你「不覆盖」的需求)'x':仅当文件不存在时创建并写入,若文件已存在则抛出异常(完美匹配你「每日最多游玩一次」的规则)'a':追加模式(若后续需要同一日多次写入可选用)
另外你文件名格式化代码有误:"[].csv".format(get_date)会生成[]20240520.csv这类错误文件名,应改为f"{get_date}.csv"或"{}.csv".format(get_date)。同时with语句会自动关闭文件,无需手动调用text_file.close()。
2. 实现文件不覆盖(每日仅写入一次)
结合'x'模式和日期命名逻辑,就能保证每日最多生成一个文件,不会覆盖已有内容。如果当日已游玩过(文件存在),代码会抛出FileExistsError,可捕获该异常给用户提示。
3. 指定存储文件夹
推荐用pathlib模块处理路径,能自动适配不同操作系统的路径分隔符,还能一键创建目标文件夹。
完整可运行代码
from datetime import datetime from pathlib import Path # 定义存储游戏数据的文件夹 save_folder = Path("game_saves") # 文件夹不存在则自动创建,已存在则不报错 save_folder.mkdir(exist_ok=True) # 生成当日日期格式的文件名 current_date = datetime.today().strftime('%Y%m%d') save_file_path = save_folder / f"{current_date}.csv" # 模拟你的游戏数据(替换为实际数据即可) game_data = "玩家名称,得分,游戏时长\n张三,890,156" try: # 'x'模式:仅文件不存在时创建并写入 with open(save_file_path, 'x', encoding='utf-8') as text_file: print(game_data, file=text_file) print("游戏数据保存成功!") except FileExistsError: print("今日已游玩过,无需重复保存数据。")
代码说明
save_folder.mkdir(exist_ok=True):自动创建game_saves文件夹,避免因文件夹不存在报错save_folder / f"{current_date}.csv":用pathlib的路径拼接生成完整文件路径,比如game_saves/20240520.csvencoding='utf-8':避免CSV文件出现中文乱码问题- 捕获
FileExistsError:给用户友好的提示信息
备选:同一日追加数据方案
如果后续需要允许同一日多次游玩并追加记录,可将写入模式改为'a',此时会在文件末尾追加新数据,不会覆盖原有内容:
with open(save_file_path, 'a', encoding='utf-8') as text_file: print(game_data, file=text_file)
内容的提问来源于stack exchange,提问作者Annah.Grace
相关产品推荐
相关产品推荐

