2015-05-30 3 views
0

Я пишу игру на Python, которая использует функцию сохранения файла. Я написал функцию, которая сохраняет все необходимые переменные, строки, списки и словари в файл. В общем, есть 11 вещей для импорта, когда я вызываю функцию под названием «load()», которую я написал.Импорт списка из файла, в список

Здесь нагрузка():

def load(): 
    importedData = open("saveGame.dat", "r+").readlines() 
    for x in range(0,len(importedData)): 
    position = importedData[0] 
    health = importedData[1] 
    strength = importedData[2] 
    exp = importedData[3] 
    playerLevel = importedData[4] 

    # playerSpells = [] 
    # spellsFromSaveFile = importedData[5] 
    # This doesn't work! 

    playerClass = importedData[6] 
    seenDialogues = importedData[7] 
    rank = importedData[8] 
    playerItems = importedData[9] 
    itemDesc = importedData[10] 
    specialItems = importedData[11] 
return position, health, strength, exp, playerLevel, playerSpells, playerClass, seenDialogues, rank, playerItems, itemDesc, specialItems 

А вот что сохранить файл выглядит следующим образом:

2 
24 
4 
96 
1 
['Blink'] 
None 
2 
Frajan 
[] 
{} 
{} 

Большинство словарей и списков будет пустым, так как они используется для предметов, которые были собраны позже в игре (этот файл сохранения был создан на ранней стадии игры).

Хотя мне нужно импортировать несколько списков и словарей, я сосредоточусь на одном из них. Список playerSpells сохраняется как ['Blink'] в файле сохранения «saveGame.dat».

Вот что я пробовал:

Я импортировал список в список под названием playerSpells:

playerSpells = [] 
playerSpells = importedData[5] 
print(playerSpells) 

print(playerSpells) Линия возвращается к этому:

['Blink']

Это похоже, что он сработал, поэтому я добавил следующий цикл:

playerSpells = [] 
playerSpells = importedData[5] 
for x in range(0,len(playerSpells)): 
    print(playerSpells[x]) 

Но получилось так:

[ 
' 
B 
l 
i 
n 
k 
' 
] 

Итак, мой вопрос: Как будет идти об импорте списка, из файла, в другой список - но добавляя слова в списке, а не отдельные символы ?

Любая помощь приветствуется.

+0

Вам было бы лучше использовать, например, ['pickle'] (https://docs.python.org/2/library/pickle.html), чтобы перенести фактические объекты, а не записывать их как текстовые представления. Единственным недостатком является то, что файл не читается человеком. – jonrsharpe

+0

@jonrsharpe Я читал о 'pickle' и думал об использовании этого, но на данный момент я исправляю файлы savefiles, и они должны быть удобочитаемыми, чтобы я мог настраивать вещи! Если я их отсортирую, я могу использовать 'pickle'. – String

+1

Вы также можете использовать JSON. Работает как рассол и читается человеком. И, конечно, читается на любом другом языке. –

ответ

2

['Blink'] читается как строка. Вы можете оценить строку, чтобы получить список Python:

import ast 

playerSpells_list = ast.literal_eval(playerSpells) 

Существует также встроенный в eval(). См. this question для объяснения, почему лучше ast.

+0

Работает как шарм. Спасибо огромное! Я приму ответ, как только смогу. – String

2

С playerSpells = importedData[5] вы сохранили строку в переменной playerSpells вместо списка. Поскольку Python не сильно типизирован, он не жалуется. Однако, когда вы перебираете строку, вы получаете символ на каждой итерации, который затем печатается.

Грязная исправление для этого является использование

import ast 
playerSpells = ast.literal_eval(importedData[5]) 

Однако существуют более эффективные решения. То, что вы здесь делаете, называется десериализацией, т. Е. Преобразованием строки обратно в структуру данных, из которой она была первоначально сериализована. В Python есть много способов сделать это.

Я рекомендую вам проверить pickle module, который был специально создан для этой задачи на Python или использовать JSON (сокращение от JavaScript Object Notation), которое является общепринятым способом хранения структур данных и будет хорошо работать с большинством языков. У Python есть module, чтобы справиться с этим.

Смежные вопросы