2014-04-21 73 views
0

我很新的编程,我刚刚完成了Codecademy中的Python课程,所以我很抱歉,如果这是一个愚蠢的问题。我正在制作一款游戏,以便我可以用我已经知道的更多练习。我想要做的是能够读取和写入列表以及混合在.txt文件中的变量。这是我的。Python如何从文件中读取和写入列表

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

目前还不清楚你的意思是什么 - “在列表的第五部分是我想要其他列表的位置”,? – shaktimaan

+0

请正确缩进您的代码 – user3159253

+0

可能''player_items'是用逗号分隔的单词列表吗? – user3159253

回答

2

尽管这不会回答你的原问题我认为如果你使用JSON而不是纯文本文件会更好。使用JSON,您不必处理从文本文件解析列表等困难。为此,创建一个json文件(我的名字叫“player.json”),其结构如下:

{“player”:“GoofyBall”,“level”:2000,“items”: [“匕首”,“剑”, “厄运魔杖”]}

然后,您可以解析文件中所需的属性。在这里,我的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 
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

-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作为存储类型。这可以很方便,因为它会自动转换字符串和整数,列表和字典;它也很容易通过文本编辑器或其他程序进行编辑。另一方面,它可能是一个陷阱,因为你最终会处理与相关混乱的“数据包”;它无法处理任意数据类型,即类。

+0

只需将代码作为答案进行倾倒,几乎没有任何解释对于那些对该语言不熟悉的人没有帮助。 – GoofyBall

+0

我的意思不是冒犯。我不需要自己“手握”自己,但我认为学习让步和“教人对鱼”类型的答案有时缺乏。我正在恢复我的downvote,因为你修改后的答案可以达到上述效果。 – GoofyBall

+1

谢谢你的深入解答,我很欣赏你给我展示了不同的做事方式以及他们每个人的优点/缺点。我将研究这个以试图找出如何改进我的编程,谢谢 – user3170915

1

我不明白你的意思。应该更清楚。 但是从我看到你将要操作不同类型的数据。 如果您发布文件的内容:savegame.txt,会更容易。

例如。如果此文件的5个内容中包含以下行:项目1,项目2,项目3. 您可以使用拆分获取新列表。

如下: player_items = save_list [5] .split( “”)

分割可与一个键字符。在上面我用“”

这将返回到一个新的列表的例子:‘项目1’,‘项目2’,‘第3项’]

+0

我现在在那里添加了我的savegame.txt。如果我理解正确,你是说我的行不需要看起来像列表,而是列表中没有任何括号,引号或逗号的项目?那个分割函数会把这些东西变成一个列表?如果我是正确的,那将会很棒 – user3170915