即使文件存在,也加载 pickle 文件 returns 'could not find file with a name' (file_name)

Loading a pickle file returns 'could not find file with a name' (file_name) even when file exists

我正在尝试加载程序最近创建的用于保存玩家角色的 pickle 文件。昨天它还在工作,但是现在如果我输入现有文件的名称,它只是 returns: 'could not find file with a name' (file_name)。我不知道我是否不小心更改了某些内容,但最好将其排序。提前致谢。

代码:

from pprint import pprint
import random
import math
import time
import datetime
import pickle
from os import system

def w(t):
    time.sleep(t)

def pickle_load():
    while True:
        save_game_name = input('\n > character file name: ')
        try:
            print('\n > loading character...')
            w(1)
            pickle_in = open(save_game_load,"rb")
            character_save = pickle.load(pickle_in)
            print(' > character loaded successfully')
            w(0.3)
            print('\n > welcome back',character_save['name'],'!')
            print(' > here are your stats from last time: ')
            print('\n >',character_save)
            break
        except:
            print(' > could not find a file with name',save_game_name)

def version_counter(filename="adventure_colussus_version_counter.dat"):
    with open(filename, "a+") as f:
        f.seek(0)
        val = int(f.read() or 0) + 1
        f.seek(0)
        f.truncate()
        f.write(str(val))
        return val
counter = version_counter()

class hero:
    def __init__(self, Hhealth, Hattack, Hluck, Hranged, Hdefence, Hmagic, Hname):
        self.health = Hhealth
        self.attack = Hattack
        self.luck = Hluck
        self.ranged = Hranged
        self.defence = Hdefence
        self.magic = Hmagic
        self.name = Hname

    def getHealth(self):
        return self.health
    def getAttack(self):
        return self.attack
    def getLuck(self):
        return self.luck
    def getRanged(self):
        return self.ranged
    def getDefence(self):
        return self.defence
    def getMagic(self):
        return self.magic
    def getName(self):
        return self.name

    def setHealth(self, newHealth):
        self.health = newHealth
    def setAttack(self, newAttack):
        self.attack = newAttack
    def setLuck(self, newLuck):
        self.luck = newLuck
    def setRanged(self, newRanged):
        self.ranged = newRanged
    def setDefence(self, newDefence):
        self.defence = newDefence
    def setMagic(self, newMagic):
        self.magic = newMagic
    def setName(self, newName):
        self.name = newName

def create_character():
    print('\n > do you prefer to play more strategically[1] or more like a warrior[2]? ')
    q1 = input(' > ')
    while q1 != '1' and q1 != '2':
        print('\n > do you prefer to play more strategically[1] or more like a warrior[2]? ')
        q1 = input(' > ')

    #a more strategic approach
    if q1 == '1':
        heroAttack = 50
        heroDefence = 100

    #a more warrior approach
    elif q1 == '2':
        heroAttack = 100
        heroDefence = 50

    print('\n > do you prefer using a bow and arrow[1] or magic[2]? ')
    q3 = input(' > ')
    while q3 != '1' and q3 != '2':
        print('\n > do you prefer using a bow and arrow[1] or magic[2]? ')
        q3 = input(' > ')

    #a more strategic approach
    if q3 == '1':
        heroRanged = 100
        heroMagic = 50

    #a more warrior approach
    elif q3 == '2':
        heroRanged = 50
        heroMagic = 100

    q2 = input('\n > press enter to roll a dice...')
    w(0.3)
    print(' > rolling dice...')
    heroLuck = random.randint(0,10)
    print(' > your hero has',heroLuck,'luck out of 10')

    heroName = input('\n > what should you hero be named? ')
    w(0.3)
    print(' > welcome! your mighty hero shall be named:',heroName,'!!!')

    return (heroAttack, heroLuck, heroRanged, heroDefence, heroMagic, heroName)


class enemy:
    def __init__(self, Ehealth, Eattack, Eluck, Eranged, Edefence, Emagic, Ename):
        self.health = Ehealth
        self.attack = Eattack
        self.luck = Eluck
        self.ranged = Eranged
        self.defence = Edefence
        self.magic = Emagic
        self.name = Ename

    def egetHealth(self):
        return self.health
    def egetAttack(self):
        return self.attack
    def egetLuck(self):
        return self.luck
    def egetRanged(self):
        return self.ranged
    def egetDefence(self):
        return self.defence
    def egetMagic(self):
        return self.magic
    def egetName(self):
        return self.name

    def esetHealth(self, newHealth):
        self.health = newHealth
    def esetAttack(self, newAttack):
        self.attack = newAttack
    def esetLuck(self, newLuck):
        self.luck = newLuck
    def esetRanged(self, newRanged):
        self.ranged = newRanged
    def esetDefence(self, newDefence):
        self.defence = newDefence
    def esetMagic(self, newMagic):
        self.magic = newMagic
    def esetName(self, newName):
        self.name = newName

def opening():
    w(0.5)
    e = datetime.datetime.now()
    print(' _____________________________________________________________________________________________________________________')
    print('\n  <Adventure Colussus>         version: v',counter,'| current date: ',e, '| date of creation: 9.2.2021')
    print(' _____________________________________________________________________________________________________________________')
    w(0.5)
    print(r"""
                  /\                       /\                        /\                       /\
                 /**\                     /**\                      /**\                     /**\
                /****\   /\      /\      /****\   /\               /****\   /\      /\      /****\   /\
               /      \ /**\    /  \    /      \ /**\             /      \ /**\    /  \    /      \ /**\
              /  /\    /    \  /    \  /  /\    /    \    /\     /  /\    /    \  /    \  /  /\    /    \
             /  /  \  /      \/      \/  /  \  /      \  /  \   /  /  \  /      \/      \/  /  \  /      \
            /  /    \/ /\     \      /  /    \/ /\     \/    \ /  /    \/ /\     \      /  /    \/ /\     \
           /  /      \/  \/\   \    /  /      \/  \/\   \     /  /      \/  \/\   \    /  /      \/  \/\   \
        __/__/_______/___/__\___\__/__/_______/___/__\___\___/__/_______/___/__\___\__/__/_______/___/__\___\_
    """)
    print(' _____________________________________________________________________________________________________________________')
    print('\n[1] create new game')
    print('[2] load existing game')
    choice = input("\n > ")

    if choice == '1':
        print("\n > you have chosen to create a new game: redirecting...")
        w(0.75)
        system('cls')
        #Carry on with creating a new game here using pickle dump
        print(' _____________________________________________________________________________________________________________________')
        print('  \n  we will begin with creating your character:                                        quick tip: choose wisely')
        print(' _____________________________________________________________________________________________________________________')
        w(0.75)
        print(r"""

                 ,;~;,                                                                ,;;,.
                    /\_                                                              /~\
                   (  /                                                             ([-])
                   (()      //)                                                   ,_.~~~.
                   | \  ,,;;'\                                                 ()--|   ,\
               __ _(  )m=(((((((((((((================--------               ,_//   |   |>)
              /'  ' '()/~' '.(, |                                         (~'  m''~)(   )/
           ,;(      )||     |  ~                                           \(~||~)/ //~\
          ,;' \    /-(.;,   )                                                 ||   ()   ()
         ,;'   ) /       ) /                                                  ||   ()   ()
               //         ||                                                  ||   ||   ||
               )_\         )_\                                                || ,;.)   (.;,
        """)
        print('\n _____________________________________________________________________________________________________________________')
        class_data = create_character()
        character = hero(100, class_data[0], class_data[1], class_data[2], class_data[3], class_data[4], class_data[5])
        w(0.3)
        print('\n > these are the stats that your character has aquired: ')
        print(' >',vars(character))
        character_save = {"health": 100, "attack": class_data[0], "luck": class_data[1], "ranged": class_data[2], "defence":  class_data[3], "magic": class_data[4], "name": class_data[5]}
        print('\n > we should now save your character if you want to come back to it later: ')
        save_game_name1 = input(' > desired name of file: ')
        save_game_name12 = save_game_name1 + '.pickle'
        pickle_out = open(save_game_name12,"wb")
        pickle.dump(character_save, pickle_out)
        print('\n> saving character...')
        w(1)
        print('> character saved successfully')
        pickle_out.close()

    elif choice == '2':
        print("\n > you have chosen to load an existing game: redirecting...")
        w(0.75)
        system('cls')
        #Carry on with loading an existing game here using pickle load
        w(0.75)
        print(' _____________________________________________________________________________________________________________________')
        print('  \n  we will begin with choosing an existing character:                             quick tip: make sure it exists!')
        print(' _____________________________________________________________________________________________________________________')
        w(0.75)
        print(r"""

                 ,;~;,                                                                ,;;,.
                    /\_                                                              /~\
                   (  /                                                             ([-])
                   (()      //)                                                   ,_.~~~.
                   | \  ,,;;'\                                                 ()--|   ,\
               __ _(  )m=(((((((((((((================-------               ,_//   |   |>)
              /'  ' '()/~' '.(, |                                         (~'  m''~)(   )/
           ,;(      )||     |  ~                                           \(~||~)/ //~\
          ,;' \    /-(.;,   )                                                 ||   ()   ()
         ,;'   ) /       ) /                                                  ||   ()   ()
               //         ||                                                  ||   ||   ||
               )_\         )_\                                                || ,;.)   (.;,
        """)
        print('\n _____________________________________________________________________________________________________________________')
        pickle_load()

    elif choice == 'credits':
        pass

    else:
        print(' > incorrect response. please try again')


opening()

我在加载 pickle 文件之前不小心删除了 save_game_load = save_game_name + '.pickle' : pickle_in = open(save_game_load,"rb").

因为它在函数 pickle_load() 中被作为异常处理,所以它没有给我任何关于问题所在的指示,这就是为什么我在 运行 程序时有点困惑的原因,因为所有 pickle 文件都在与主 .py 文件相同的文件夹和目录中。

感谢 Uptal Dutt 帮我解决了这个问题。