使用open()在json文件上抛出错误

时间:2014-12-08 08:50:12

标签: python json

所以我对编码非常陌生,我想设计一个基于文本的RPG作为学习一些东西的有趣方式,我选择了Python语言,因为它是以Monty Python命名的。多么完美吧?嗯,这是我想到的,直到试图让房间装满。

我正在使用json文件来存储我的房间名称,描述和出口,然后尝试通过我在YouTube上看到的方法在python中调用它们,这里是代码:

def getRoom(id):
    ret = None
    with open(str(id)+".json", "r") as f:
        jsontext = f.read()
        d = json.loads(jsontext)
        d['id'] = id
        ret = Room(**d)

这引发了一个IOError目录或文件未找到,所以我添加了一个try语句,如下所示:

def getRoom(id):
    ret = None
try:
    with open(str(id)+".json", "r") as f:
        jsontext = f.read()
        d = json.loads(jsontext)
        d['id'] = id
        ret = Room(**d)
except IOError:
    print("An error occured")

但是现在我得到一个“AttributeError:'NoneType'对象没有属性'name'”off off look命令我编码如下:

def look(player, args):
    print(player.loc.name)
    print("")
    print (player.loc.description)

如果这里重要的是我的json文件,我将其命名为1.json:

{
    "name": "A Small Bedroom",
    "description": "The old bed room has probably seen many people over the years as the inn sits along a major trade route. The floor boards show wear and creak as you walk over them.",
    "neighbors": {"w":2}
}

编辑:

完整追溯:

Traceback (most recent call last):
   File "game.py", line 79, in <module> 
       main(player) File "game.py", line 68, in main
           player.loc = getRoom(1)
   File "/home/illyduss/Urth/Locations/room.py", line 6, in getRoom 
       with open(str(id)+".json", "r") as f:
IOError: [Errno 2] No such file or directory: '1.json'

1 个答案:

答案 0 :(得分:2)

错误清楚地表明找不到该文件。请尝试以下方法。 1.确保在调用python解释器的位置可以使用文件名1.json

例如:如果您正在调用$ python game/game.py,那么该文件应位于当前工作目录中,而不是game目录

如果可以,请尝试使用绝对路径

import os
base_dir = /path/to/json/dir
filename = str(id)+".json"
abs_file = os.path.join(base_dir, filename)
with open(abs_file, "r"):
    #do stuff

如果你需要json文件相对于game.py文件并且仍然需要从其他地方调用游戏文件,一个好的做法是使用python文件的__file__属性定义base_dir < / p>

base_dir = os.path.dirname(__file__)

你发现NoneType错误的原因是loc变量被设置为None。这意味着你将None传递给Player的构造函数。由于您没有提供初始化播放器的代码,我假设您将getRoom()的结果作为loc传递给构造函数。如果是这种情况,请确保getRoom返回的值不是None。你需要在函数末尾有一个显式的return语句。返回。默认情况下,任何没有return语句的函数都返回None。这可能是你的问题