目的是查看脚本上方目录中的json文件,并加载它在该文件中找到的内容。这就是我所拥有的:
import os
import json
settings_file = '/home/me/foo/bar.txt'
root = os.path.dirname(os.path.dirname(os.path.abspath(settings_file))) # '/home/me'
target = os.path.join(root,'.extras.txt') # '/home/me/.extras.txt'
db_file= open(target)
databases = json.load(db_file) # works, returns object
databases2 = json.load(open(target)) # equivalent to above, also works
# try to condense code, lose pointless variables target and file
databases3 = json.load(open(os.path.join(root,'.extras.txt'))) # equivalent (I thought!) to above, doesn't work.
那么......为什么不是一次性,没有保持变量版本工作?哦,返回的错误是(现在完整的):
$ ./json_test.py
Traceback (most recent call last):
File "./json_test.py", line 69, in <module>
databases = json.load(open(os.path.join(root,'/.extras.txt')))
IOError: [Errno 2] No such file or directory: '/.extras.txt'
为了满足S.Lott的善意建议...... target
的设定并不重要。数据库和数据库2正确填充,而数据库3则没有。 target
存在,可读并包含json期望看到的内容。我怀疑有些东西我不理解串联命令的性质......我可以使代码工作,只是想知道为什么简洁(或复杂?)版本失败。
答案 0 :(得分:0)
代码看起来很好,确保引用的文件位于适当的位置。鉴于您的代码包含目标/文件变量赋值,.extras.txt
的完整路径为
/home/me/.extras.txt
答案 1 :(得分:0)
你需要这样做:
file = open(target, 'w')
因为默认情况下open
会尝试以读取模式(r
)打开文件,但是如果要创建它,则需要以w
(写入)模式打开它
另外,我不会使用变量名file
,因为它也是python中的类型(<type 'file'>
)。
您也可以将写入模式标志添加到此行:
databases = json.load(open(os.path.join(root,'.extras.txt'), 'w'))
因为我们在问题中提供的信息有限,所以您的/.extras
文件似乎以前不存在。
最后请注意,您在此行中丢失了打开文件的句柄(因为您没有将其存储在file
变量中):
databases = json.load(open(os.path.join(root,'.extras.txt')))
你打算在完成文件后如何关闭文件?
您可以使用上下文管理器(如果使用import with_statement
则python&gt; = 2.6或2.5):
with open(os.path.join(root,'.extras.txt'), 'w') as f:
databases = json.load(f)
将负责为您关闭文件。