Python如何从文件中读取和写入列表

时间:2014-04-21 02:07:37

标签: python list file-io

我对编程很新,我刚刚在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.

此外,知道我的列表不会保持相同的大小可能很重要。

非常感谢任何帮助,谢谢。

4 个答案:

答案 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作为存储类型。这很方便,因为它可以自动转换字符串和整数,列表和字典;它也可以通过文本编辑器或其他程序轻松编辑。另一方面,它可能是一个陷阱,因为你最终处理了一大堆数据"与杂乱相关;它无法处理任意数据类型,即类。