【问题标题】:Python storing & accessing information via txt filePython 通过文本文件存储和访问信息
【发布时间】:2018-11-13 02:17:58
【问题描述】:

我正在为我正在学习的一门课程编写一个赌博/骰子游戏程序,每周都会添加新的要求,我们必须实施新代码,而不会从根本上改变我们迄今为止编写的代码。我遇到问题的部分是:现在,如果用户退出(通过输入“0”作为他们的“赌注”),他们的“银行”的内容将保存到一个文本文件中,以便他们稍后可以恢复播放以相同数量的“奖金”。如果用户破产(游戏结束),下次他们运行程序时,他们的银行将重置为默认金额(500 美元)。当程序启动时,代码应该检查是否存在保存先前播放数据的文件(bank.txt);如果文件存在,bank.txt中的数字就是用户的“银行”;如果文件不存在,程序会创建它并向用户的银行添加 500 美元。通过在这里和那里调整一些东西,我已经让代码的部分工作了(即,以 800 美元的银行存款退出,重新启动游戏,它仍然存在),但我已经做了这么久(并且很沮丧)我只是无法弄清楚我在这里做错了什么。

> `import os
import random
def main():
    intro()
    bank = check_bank()
    show_bank(bank)
    bet = bet_validation(bank)`

那是程序的开始,显然,我似乎无法正确的部分在下面......如果我需要发布更多代码,那不是问题,只是其他一切似乎都可以工作对(以下除外)

def check_bank():
    try:
        if os.path.isfile('./bank.txt') == True:
            bank_file = open('bank.txt','r')
            if float(bank_file.readline()) > 0.0:
                bank = float(bank_file.readline())
                return bank
            else:
                bank = 500.00
                return bank
        else:
            bank_file = open('bank.txt','w')
            bank_file.write(str(500.0))
            bank = float(bank_file.readline())
            bank_file.close()
            return bank
    except IOError:
        print('IOError in check_bank')
    except ValueError:
        print('ValueError in check_bank')
    except Exception as err:
        print(err,'in check_bank')
    finally:
        bank_file.close()

我们将不胜感激任何和所有帮助/建议/提示。当我启动程序时,我从“check_bank()”函数中得到一个“ValueError”异常。如果有必要,我很乐意提供我的其余代码,只包括这一点,因为它似乎是我遇到问题的地方。如果您能提供帮助,让我知道我做错了什么,以及如何纠正它!提前谢谢各位!

【问题讨论】:

  • 你能把except ValueError替换成except ValueError as e然后print(e)吗?还是只显示堆栈跟踪?您还混淆了else 分支。
  • “无法将字符串转换为浮点数”...有问题的“字符串”是“500.0”
  • 尝试将该字符串保存到对象中并打印它以确保它不包含错误的字符。因为float('500.0') 将在 100% 的情况下工作。

标签: python python-3.x


【解决方案1】:

终于破解了!更改了以下代码,然后宾果游戏!

def check_bank():
try:
    if os.path.isfile('./bank.txt') == True:
        bank_file = open('bank.txt','r')
        bank = float(bank_file.readline())
        if bank > 0:
            return bank
        else:
            bank = 500.0
            return bank

【讨论】:

    【解决方案2】:

    正如@deHart 提到的,例外是“无法将字符串转换为浮点数”。问题是您正在读取第一行以检查文本文件,然后读取下一行(空)以设置银行。

    相反,读取该行并将其存储到一个变量中。然后,进行比较并从此变量设置银行 - 这应该修复 ValueError。

    这是对我有用的修改版本:

    def check_bank():
        try:
            if os.path.isfile('./bank.txt') == True:
                bank_file = open('bank.txt','r')
                vault = float(bank_file.readline())
                if vault > 0.0:
                    bank = vault
                    return bank
                else:
                    bank = 500.00
                    return bank
            else:
                bank_file = open('bank.txt','w')
                bank_file.write(str(500.0))
                bank = float(bank_file.readline())
                bank_file.close()
                return bank
        except IOError:
            print('IOError in check_bank')
        except ValueError:
            print('ValueError in check_bank')
        except Exception as err:
            print(err,'in check_bank')
        finally:
            bank_file.close()
    

    这里有几点说明:

    • 这“修复”了问题,但您仍然可以抛出 ValueError。
    • 这可能在其他地方有所涉及,但您需要在银行低于 0 时更新文本文件!

    【讨论】:

    • 干得好!你比我早了大约 12 分钟!我有一个真正的困难时期。存在防止银行低于 0 的代码(一旦银行达到 0,游戏结束,输入验证以防止玩家下注超过他们在银行中的赌注)。我真的非常感谢你花时间帮助我!
    【解决方案3】:

    您不应该以纯文本形式存储您的值。我更喜欢用泡菜

    import pickle, os
    
    def check_bank():
        try:
            file_path = './bank.txt'
    
            #ckeck if file exists
            if os.path.isfile(file_path):
                file_handler = open(file_path,'rb')
                bank = pickle.load(file_handler)
    
                return bank
    
            #if the file doesn't exist    
            else:
                file_handler = open(file_path, 'wb')
                pickle.dump(500, file_handler)
                file_handler.close()
                return 500
        except IOError:
            print("IOError occured")
    
        except EOFError:
            #if the file is empty
            file_handler = open(file_path, 'wb')
            pickle.dump(500, file_handler)
            file_handler.close()
            return 500
    

    【讨论】:

    • 仍然很新,这个答案有点超出我的理解......但我很感兴趣。我一定会研究您在这里向我展示的内容,并希望能从中学到所有东西。
    猜你喜欢
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 2020-01-12
    • 1970-01-01
    相关资源
    最近更新 更多