String对象没有读取属性

时间:2017-08-31 13:20:09

标签: python string file

我在尝试读取JSON文件时遇到错误:

def get_mocked_json(self, filename):
    f = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../fixtures', filename)
    if os.path.exists(f) is True:
        return json.loads(f.read())
    else:
        return 'mocked.json'

这是错误:

           if os.path.exists(f) is True:
---->          return json.loads(f.read())
           else:
               return 'mocked.json'

AttributeError: 'str' object has no attribute 'read'

我非常感谢你对我所做错事的任何帮助。

1 个答案:

答案 0 :(得分:2)

您的f只是一个字符串,无法读取字符串。我认为这里混淆的原因是os.path函数只是确保字符串代表操作系统上的有效文件 - 路径

要实际read它,您需要先open该文件。这将返回一个可以read的流:

def get_mocked_json(self, filename):
    f = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../fixtures', filename)
    if os.path.exists(f) is True:
        with open(f) as fin:  # this is new
            return json.loads(fin.read())
    else:
        ...

请注意,if os.path.exists(...)可能会受到竞争条件的影响。如果另一个进程删除了ifopen文件之间会发生什么?或者,如果您没有权限打开它?

这可以通过try打开它并处理不可能的情况来避免:

def get_mocked_json(self, filename):
    f = os.path.join(os.path.dirname(os.path.realpath(__file__)), '../fixtures', filename)
    try:
        with open(f) as fin:
            return json.loads(fin.read())
    except Exception:  # or IOError
        ...