【问题标题】:Python open() with minimal fluff variables具有最少绒毛变量的 Python open()
【发布时间】:2011-09-07 21:04:10
【问题描述】:

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

【问题讨论】:

  • 你确定root是正确的,错误提示它是/或'',而你的代码给出了其他东西
  • @Wounder:请 (1) 更新问题。切勿将 cmets 添加到您拥有的问题中。 (2) 使用 target 的值更新工作和非工作示例。请创建一个非常非常清晰的日志。很难从问题中找出问题所在。
  • 代码乍一看还不错,如果您提供一个完全失败的交互式 python 会话可能会有所帮助。
  • 显然您正在尝试打开/.extras.txt 而不是/home/me/.extras.txt,尽管您可能相信。蟒蛇没有撒谎……
  • “数据库和数据库 2 正确填充,而数据库 3 正确填充”。如果没有详细、完整、易于查看的日志来显示有效的代码和变量值,以及不使用变量值的代码,我们就不容易理解。由于您的错误消息显示了至少 69 行代码(您的 sn-p 没有这些代码),因此我们得出一个结论。实际代码 像 sn-p。请证明 sn-p 不起作用。

标签: python json file-io


【解决方案1】:

代码看起来不错,请确保引用的文件位于适当的位置。鉴于您的代码包含目标/文件变量分配,.extras.txt 的完整路径是

/home/me/.extras.txt

【讨论】:

    【解决方案2】:

    你需要做的:

    file = open(target, 'w')
    

    因为默认情况下open 会尝试以读取模式 (r) 打开文件,但如果您想创建它,则需要以w(写入)模式打开它。

    另外,我不会使用变量名file,因为它也是python中的一种类型(&lt;type 'file'&gt;)。

    您也可以将写入模式标志添加到该行:

    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 >=2.6 或 2.5):

    with open(os.path.join(root,'.extras.txt'), 'w') as f:
       databases = json.load(f)
    

    它将为您关闭文件。

    【讨论】:

    • 不过,这不是写的。只是一读。而且我尝试用标志明确表示......并没有改变事情。我更改了文件的变量名,这不是我所说的……我为提高可读性而失败,抱歉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多