我对编程很新,我刚刚在Codecademy完成了Python课程,所以如果这是一个愚蠢的问题,我很抱歉。我正在做一个游戏,所以我可以用我已经知道的东西练习更多。我想要做的是能够读取和写入列表以及.txt文件中的变量混合。这就是我所拥有的。
def read_file():
global player_name, player_gender, player_lvl, player_gold, player_xp, player_items, strength, vitality, charisma, intellect, agility, player_hp, player_magicka, player_taunt, player_victory, player_fact, save_list, help_list
save_file = open("savegame.txt", "r+")
save_list = []
for item in save_file:
save_list.append(item)
player_name = str(save_list[0])
player_gender = str(save_list[1])
player_lvl = int(save_list[2])
player_gold = int(save_list[3])
player_xp = int(save_list[4])
player_items = [] #This is where I left it because I don't know how to read lists
strength = int(save_list[6])
vitality = int(save_list[7])
intellect = int(save_list[8])
charisma = int(save_list[9])
agility = int(save_list[10])
player_hp = int(save_list[11])
player_magicka = int(save_list[12])
player_taunt = str(save_list[13])
player_victory = str(save_list[14])
player_fact = player_name + str(save_list[15])
save_list只是我从中提取变量和列表的列表,我知道它可能不需要。在我的列表的第五部分是我想要我的其他列表,但我不知道如何从字符串形式中取出它并将其转换为列表。我知道如果整个文件只是一个列表,我可以迭代它来制作一个列表,但由于我有其他的东西,它并不那么简单。
这是我的保存文件(.txt)的样子。我需要弄清楚如何加载["这部分应该是一个列表"]行作为列表。
Mr May
Male
6
3340
1380
["This part is supposed to be a list"]
6
1
4
2
2
55
85
You suck!!!
I will never lose!!!
Mr May was tormented by potatoes as a child.
此外,知道我的列表不会保持相同的大小可能很重要。
非常感谢任何帮助,谢谢。
答案 0 :(得分:2)
我们需要在此处设置的信息是如何格式化文件中的数据。例如,我们可以在每一行上放置一个元素:
1
2
3
我会称之为"行划界"。我建议的是以JSON格式存储和加载数据。
import json
json.dump([1,2,3,4], open("outfile2.json", "w"))
save_list = json.load(open("outfile.json"))
save_list
[1, 2, 3, 4]
可以找到更多文档here。
答案 1 :(得分:2)
虽然这不能回答你原来的问题,但我认为如果你使用JSON而不是纯文本文件会更好。使用JSON,您不必处理诸如从文本文件中解析列表之类的困难。为此,创建一个json文件(我的名为" player.json"),其结构如下:
{"玩家":" GoofyBall","等级":2000,"项目":["匕首和#34 ;,"剑", "厄运的魔杖" ]}
然后,您可以解析文件以获取所需的属性。在这里,我将json文件简化为几个属性以用于演示目的,但您可以根据需要添加它:
import json
json_data=open('player.json') #open the json file
data = json.load(json_data) # load the json data
# get the attributes you want
print "Player name:" + data['player']
print "Level: " + str(data['level'])
print "Items" + str(data['items'])
我希望这可以帮助你的游戏。
答案 2 :(得分:1)
我完全不明白你的意思。应该更清楚。 但是从我看到你将要操作不同类型的数据。 如果您发布文件的内容会更容易:savegame.txt。
例如。如果此文件在5内容中包含以下行:项目1,项目2,项目3。 您可以使用拆分获得新列表。
如下: player_items = save_list。[5] .split(",")
拆分适用于关键字符。在上面的示例中,我使用了','
这将返回到一个新列表:["项目1","项目2","项目3"]
答案 3 :(得分:-2)
像
这样的东西class Player:
@classmethod
def from_file(cls, fname):
with open(fname) as inf:
return cls(*(line.rstrip() for line in inf))
def __init__(self, name, gender, health, hp, strength, charisma, intellect, agility, magicka, gold, xp, taunt, victory, items):
self.name = name
self.gender = gender
self.health = int(health)
self.hp = int(hp)
self.strength = int(strength)
self.charisma = int(charisma)
self.intellect = int(intellect)
self.agility = int(agility)
self.magicka = int(magicka)
self.gold = int(gold)
self.xp = int(xp)
self.taunt = taunt
self.victory = victory
self.items = items.split(",") # convert comma-delimited string to list
def save_file(self, fname):
with open(fname, "w") as outf:
output = [
self.name,
self.gender,
self.health,
self.hp,
self.strength,
self.charisma,
self.intellect,
self.agility,
self.magicka,
self.gold,
self.xp,
self.taunt,
self.victory,
",".join(self.items) # convert list to comma-delimited string
]
outf.write("\n".join(str(op) for op in output))
def main():
char1 = Player.from_file("savegame.txt")
# now do something with character!
if __name__=="__main__":
main()
可以使用str.join
将列表转换为字符串,如",".join(mylist)
中所示。这假定mylist的元素已经是字符串。然后可以使用str.split()
将字符串转换回字符串列表,如mystr.split(",")
中所示。
使用全局变量通常是一个坏主意,因为(a)它将你的函数绑定到一组变量 - 如果你想加载第二个字符,你必须编写另一个函数; (b)它使调试更难,因为数据变化的来源并不明显; (c)它使你的全球范围变得混乱了许多无关的变量。
使函数返回一组值或数据结构是一种改进,因为它允许您重用代码并减少混乱;但它往往会导致一大堆函数对数据结构做各种各样的事情,而且通常是一堆相似但不相同的结构,具有相关的几乎相同的功能,混乱和混乱。
下一步是使各种功能属于"它们的相关数据结构 - 这被称为"面向对象"并在Python中作为一个类实现。我上面的代码创建了一个Player类,它保存单个玩家的所有相关数据,并具有成员函数,可以初始化播放器,从文件加载一个或保存回文件。然后我有一个main()函数来演示加载播放器的数据。
有些人建议使用JSON作为存储类型。这很方便,因为它可以自动转换字符串和整数,列表和字典;它也可以通过文本编辑器或其他程序轻松编辑。另一方面,它可能是一个陷阱,因为你最终处理了一大堆数据"与杂乱相关;它无法处理任意数据类型,即类。