我有一个有趣的问题,我想弄明白。我有一个大型程序,在该程序的一部分我正在制作一个.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,但是在这个时候我想弄清楚为什么第一个选项失败了。我几乎在其他程序中使用了完全相同的代码来写入日志文件等等,然后就可以了。有人有什么想法吗?
答案 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
块的末尾,您就不需要手动关闭文件。