2016-04-01 4 views
0

Ich habe eine Textdatei, von der ich Informationen als Variablen gelesen habe, als ein System zum Speichern in meinem Spiel. Das Problem ist, ich brauche mein Dokument zu lesen und zu einer bestimmten Zeile zu schreiben, es funktioniert gut das erste Schreiben und Lesen, aber das zweite Mal die Zeile, bevor es eine nach oben gegangen ist und ich bekomme "Index außerhalb des Bereichs" Da Zeile I ' m zu schreiben/lesen ist leer.Warum ändern Variablen Zeilen beim Schreiben in Textdateien?

First Read Write

enter image description here

Ich habe meinen Code durchgesehen und kann nicht scheinen, um das Problem zu finden ..

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() 

Ich habe ein wenig tausend Zeilen über, aber ich Ich denke, hier liegt das Problem, wenn es eines gibt.

+0

Warum konnten Sie Ihre Datenstruktur nicht als eine ['JSON'] (https://docs.python.org/3/library/json.html) Datei speichern –

+0

Sie fügen Zeilenumbrüche entweder falsch hinzu oder entfernen sie –

+0

@AnttiHaapala Ich bin relativ neu in Python, also habe ich keine Erfahrung mit .JSON-Dateien arbeiten. – Daijoubu

Antwort

2

Ich glaube, der Fehler tritt entweder auf, weil Sie rstrip irgendwo verwenden, die die Newline-Zeichen am Ende der Zeilen streift; oder es könnte sein, dass du von mit linecache; obwohl Python 2-Dokumentation sagt etwas über allgemein linewise random access, in Python 3 die Dokumentation eindeutig fest, dass:

Das linecache Modul einer beliebige Linie aus einer Python-Quelldatei intern, beim Versuch erhalten können zu optimieren mit einem Cache, der häufige Fall, in dem viele Zeilen aus einer einzigen Datei gelesen werden. Dies wird vom Traceback-Modul verwendet, um Quellzeilen für die Aufnahme in das formatierte Traceback abzurufen.

Auf jeden Fall mit linecache ein für Ihren Anwendungsfall sehr schlechte Übereinstimmung ist, weil linecache geht davon aus, dass die Dateien nicht ändern, aber Ihre savefiles ändern sich; und du erfrischst sie nach dem Speichern. Ich würde empfehlen, dass Sie sparen würde und Ihre Spielzustand Daten zu und von einem einzigen Wörterbuch laden json.load und json.dump

So etwas mit:

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) 

Ausführen des Programms druckt

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

und der Inhalt von mysavegame sind

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

stimmten zu, dass json hier die richtige Lösung ist. Das seltsame Verhalten dieser Textdateien ist nur ein Symptom für die schlechte Lösung. –

Verwandte Themen