【问题标题】:How to create a dictionary based on a text file?如何根据文本文件创建字典?
【发布时间】:2015-11-16 00:19:11
【问题描述】:

我正在编写一个简单的 python 游戏,其中我有一个如下格式的文本文件,其中左边的键是玩家的名字,右边的值是玩家的分数:

名称 134

下一个名字 304958

等等……

问题:我如何读取该格式的文本文件并根据每行的值创建一个字典,并且一旦播放器退出程序,文件就会更新为最新的字典条目?强>

我已经注释掉了一些我已经开始但无法实施和开始工作的代码。任何帮助表示赞赏。

这是我的代码:

    # with open('scores.txt', 'r') as file:
    #     scores = {}
    #     for line in file:
    #         line = line.split()
    #         do stuff

   
    # with open("scores.txt", "w") as f:  # Save dictionary in file
    #     do stuff

            

【问题讨论】:

  • 尝试使用 JSON。这是一种以纯文本形式存储字典的方式,几乎所有语言都支持它
  • 在您的代码中具体是什么不起作用,您有一些代码看起来朝着正确的方向发展,但它是如何失败的?这里有很多不相关的额外代码,是否可以将其删除以使您的问题更清楚?
  • @PaulRooney 我已经删除了额外的代码。基本上我希望我的 Python Turtle GUI 程序在每次启动程序时读取此文件并将其存储在字典中,然后在程序结束后保存。
  • with open("scores.txt") as f: scores = dict( [line.split() for line in f.readlines()])。当然,您还有很多其他选择:json、pickle、csv 甚至 sqlite

标签: python file user-interface dictionary input


【解决方案1】:

要加载该格式:

with open('scores.txt', 'r') as infile:
    scores = {}
    for line in infile:
        name, _, score = line.rpartition(' ')
        scores[name] = int(score)

保存该格式:

with open('scores.txt', 'w') as outfile:
    for name, score in scores:
        outfile.write('%s %s\n' % (name, score))

penne12 是正确的。您可以通过使用 json 库来存储 JSON 而不是这种特定的文本格式来节省几行代码。

【讨论】:

    【解决方案2】:

    这是一个使用 cmets 中建议的 JSON 的示例:

    import json
    def load_game_data():
        data = None
        with open('savegame.json', 'r') as savefile:
            data = json.load(savefile)
    
        return data
    
    
    def save_game_data(data):
        with open('savegame.json', 'w') as savefile:
            json.dump(data, savefile)
    
    # Store the game data as a dictionary:
    data = { 'player_name' : 'wolfram', 'hp' : 8 }
    save_game_data(data)
    data = load_game_data()
    
    print(data)
    # prints {'player_name': 'wolfram', 'hp': 8}
    print(data['player_name'])
    print(data['hp'])
    

    数据以 JSON 格式保存到磁盘,并作为字典从磁盘加载,易于使用。您需要添加代码错误处理,当然,这只是一个简单的说明。

    【讨论】:

    • @SteveJessop 太棒了!这些年来,我一直在不知不觉中这样做......我已经编辑了这个例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    相关资源
    最近更新 更多