在python中创建和写入文件但不写入或关闭文件

时间:2014-01-06 22:53:07

标签: python file python-2.7

我有一个有趣的问题,我想弄明白。我有一个大型程序,在该程序的一部分我正在制作一个.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

代码运行,不会给我任何错误,除了不触发,但是在创建文件时没有写入任何内容。另外,我不能在不先关闭Python的情况下删除文件,因此.close似乎也没有发生。但是如果我在.write和.close之后放置print语句,它们都会触发,所以程序可能会触及所有行。上面的文字是整个程序,所以没有什么可以搞乱它。

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

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,但是在这个时候我想弄清楚为什么第一个选项失败了。我几乎在其他程序中使用了完全相同的代码来写入日志文件等等,然后就可以了。有人有什么想法吗?

1 个答案:

答案 0 :(得分:3)

通过键入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仅打印该方法的repr表示,并且不会调用它。

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