为什么变量在写入文本文件时会改变行?

时间:2016-04-01 19:03:32

标签: python python-3.x

我有一个文本文件,我将信息作为变量读取,作为游戏中的保存系统。问题是我需要我的文档来读取和写入某一行,它在第一次写入和读取时工作正常,但是第二次在它之前的行向上移动一行并且我得到"索引超出范围&#34 ;因为尝试写入/读取的第I行是空白的。

First Read Write

enter image description here

我查看了我的代码,似乎无法找到问题..

gold=(60)
goldtxt=(str(gold) + 'gp')
inventory=['empty','empty','empty','empty','empty','empty','empty','empty','empty','empty',]

def ItemAdd(event):
   gamestatus = linecache.getline('C:Location', 2).rstrip() 
   if gamestatus == 'gamestatus1':       
      gameinfo1[7] = (inventory[(-1)]).strip('empty') + ' '
      gameinfo1[9] = goldtxt + '             '
      with open('C:Location', 'w') as active:
         active.writelines(gameinfo1) 
         RefreshTexts() 

def RefreshTexts():
    with open('C:Location', 'r') as file: 
        datatemplate = file.readlines() 
    with open('C:Location', 'r') as file: 
        gameinfo1 = file.readlines() 
    with open('C:Location', 'r') as file: 
        gameinfo2 = file.readlines() 
    with open('C:Location', 'r') as file: 
        gameinfo3 = file.readlines() 
    with open('C:Location', 'r') as file: 
        activeinfo = file.readlines()

我有一千多行,但我认为如果有一条问题就会出现问题。

1 个答案:

答案 0 :(得分:2)

我认为错误发生的原因可能是因为您在某处使用rstrip去除了行末尾的换行符;或者可能是你使用linecache ab ;尽管Python 2文档说明了一般的行式随机访问,但在Python 3中,文档明确指出:

  

linecache模块允许用户从Python源文件获取任何行,同时尝试在内部进行优化,使用缓存,这是读取多行的常见情况来自单个文件。跟踪模块使用它来检索包含在格式化回溯中的源代码行。

在任何情况下,使用linecache与您的用例匹配都非常差,因为linecache假定文件不会更改,但您的保存文件确实会更改;并且您在保存后会刷新它们。我建议您使用json.loadjson.dump

将游戏状态数据保存到单个字典并从中加载

类似的东西:

import json

def save_game(game_data):
    with open('mysavedgame', 'w') as save_file:
        json.dump(game_data, save_file)

def load_game():
    with open('mysavedgame', 'r') as save_file:
        return json.load(save_file)

def new_game():
    return {
        'items': [],
        'money': 0
    }

# when starting a new game
game_data = new_game()

# adding items, money:
game_data['items'].append('Crystal sword')
game_data['money'] += 60

# when saving a game, use
save_game(game_data)

# and load the data with
game_data = load_game()
print(game_data)

运行程序打印

{'money': 60, 'items': ['Crystal sword']}

并且mysavegame的内容是

{"money": 60, "items": ["Crystal sword"]}