Python open()具有最小的fluff变量

时间:2011-09-07 21:04:11

标签: python json file-io

目的是查看脚本上方目录中的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期望看到的内容。我怀疑有些东西我不理解串联命令的性质......我可以使代码工作,只是想知道为什么简洁(或复杂?)版本失败。

2 个答案:

答案 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)

将负责为您关闭文件。