在Python中关闭文件的明确方法

The*_*her 11 python file

请看下面的代码:

for i in xrange(1,5000):
    with open(r'test\test%s.txt' % i, 'w') as qq:
        qq.write('aa'*3000)
Run Code Online (Sandbox Code Playgroud)

它似乎是根据所有Python规则编写的; 文件在使用后关闭.好像.但实际上它似乎建议(!)系统关闭文件,而不是显式关闭它,因为当我在资源监视器上查看它时会显示很多打开的文件.它给了我很多问题,因为在我的脚本中我使用了很多文件,经过很长一段时间我得到了"太多打开文件"错误,尽管从源代码中"关闭"它.

有没有办法在Python中显式关闭文件?或者我如何检查文件是否真的(!)关闭?

更新:我刚试过另一个监控工具 - 来自Sysinternals的Handle,它显示所有正确的,我相信它.因此,它可能是资源监视器本身的问题.

截图显示打开的文件:

运行脚本的资源监视器

glg*_*lgl 10

你的代码

for i in xrange(1, 5000):
    with open(r'test\test%s.txt' % i, 'w') as qq:
        qq.write('aa' * 3000)
Run Code Online (Sandbox Code Playgroud)

在语义上完全等同于

for i in xrange(1, 5000):
    qq = open(r'test\test%s.txt' % i, 'w')
    try:
        qq.write('aa' * 3000)
    finally:
        qq.close()
Run Code Online (Sandbox Code Playgroud)

with与文件一起使用是一种确保文件在with块保留后立即关闭的方法.

所以你的问题必须在其他地方.

也许正在使用的Python环境的版本有一个错误,fclose()由于某种原因没有调用.

但你可能会尝试类似的东西

try:
    qq.write('aa' * 3000)
finally:
    # qq.close()
    os.close(qq.fileno())
Run Code Online (Sandbox Code Playgroud)

系统直接调用.

  • 在Python级别,它已关闭.Finito.如果它仍然在系统级别打开,问题可能在:1)您正在使用的Python实现,2)操作系统及其用于监视打开文件的kerneL,3)工具. (4认同)