我在尝试读取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'
我非常感谢你对我所做错事的任何帮助。
答案 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(...)
可能会受到竞争条件的影响。如果另一个进程删除了if
和open
文件之间会发生什么?或者,如果您没有权限打开它?
这可以通过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
...