【问题标题】:Make and write to file in python makes but doesn't write or close file在python中制作和写入文件会制作但不写入或关闭文件
【发布时间】:2014-01-06 22:53:07
【问题描述】:

我有一个有趣的问题正在尝试解决。我有一个大型程序,并且在该程序的一部分中,我正在制作一个 .xml 文件并写入它(只使用字符串而不使用 lxml 或任何东西)。我把那个特定的代码放到它自己的程序中进行测试并且遇到了一个问题。代码是

import os
directory = 'FileDirectory'
name = 'Test File.xml'

if not os.path.exists('K:\\JOBS\\' + directory + '\\XML Files\\'):
    os.makedirs('K:\\JOBS\\' + directory + '\\XML Files\\')
xmlJob = open('K:\\JOBS\\' + directory + '\\XML Files\\' + name, 'w')
try:
    xmlJob.write('Test write')
except:
    print "Unexpected error:", sys.exc_info()[0]
    raise
xmlJob.close

代码运行,没有给我任何错误,except 没有触发,但是当文件被创建时,里面没有任何内容。此外,如果不先关闭 Python,我也无法删除文件,因此 .close 似乎也没有发生。但是,如果我在 .write 和 .close 之后放置打印语句,它们都会触发,所以程序应该会命中所有行。上面的文字是整个程序,所以没有什么可以弄乱它的。

现在,当我改为使用时,一切正常。所以代码

import os
directory = 'FileDirectory'
name = 'Test File.xml'

with open('K:\\JOBS\\' + directory + '\\XML Files\\' + name, 'w') as xmlJob:
    xmlJob.write('Test write')

运行良好。所以显然我可以使用 with 而不是 open 和 .close,但此时我想弄清楚为什么第一个选项失败了。我在其他程序中使用了几乎完全相同的代码来写入日志文件等,然后它就可以工作了。有人有什么想法吗?

【问题讨论】:

  • xmlJob.close 没有 () ???
  • 您应该养成使用os.path.join() 组合路径名的习惯。它知道您的操作系统需要正斜杠还是反斜杠,并且永远不会忘记双反斜杠。

标签: python file python-2.7


【解决方案1】:

通过键入xmlJob.close,您指的是xmlJob 对象上的类方法close,但不是调用它。

注意以下几点:

>>> f = open("tmp.txt")
>>> f
<open file 'tmp.py', mode 'r' at 0x7f906e8c5ae0>
>>> f.close
<built-in method close of file object at 0x7f906e8c5ae0>
>>> f
<open file 'tmp.py', mode 'r' at 0x7f906e8c5ae0>
>>> f.close()
>>> f
<closed file 'tmp.py', mode 'r' at 0x7f906e8c5ae0>

调用f.close 仅打印该方法的representation,而不调用它。

您的第二个代码块起作用的原因是 with open(x) as y 构造具有 alotsyntactic sugar behind the scenes。除了异常处理,它还干净地处理对象的关闭。这意味着一旦到达 with 块的末尾,您就不需要手动关闭文件。

【讨论】:

  • 哇,我是个白痴。我看了十几次,没有意识到我在 .close 之后错过了 ()。德普。
  • @JediWolf 我们有时都会这样。我知道我……经常这样做。
猜你喜欢
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 2013-09-09
  • 1970-01-01
  • 2013-10-18
相关资源
最近更新 更多