Python不会关闭打开的文件

时间:2015-09-18 07:35:39

标签: python

我有一个Python脚本,可以在for循环中打开很多(超过200万个)小文本文件。但是,当我达到大约150'000个文件时,它会停止,这表明我已达到Linux内核中打开文件的默认限制。

但是,我正在关闭文件,所以我不确定为什么我会达到这个限制。有趣的部分分解为:

import os

files = os.listdir('/var/tmp/files')

for file in files:
    fd = open('/var/tmp/files/{}'.format(file), 'r')
    content = fd.readlines()

    # Doing stuff

    fd.close()

代码有效,但显然它不会关闭文件。起初我尝试了更好的with open()语句,但这也没有用。

为什么Python不关闭文件?

4 个答案:

答案 0 :(得分:1)

谢谢你们。问题是我的用户无权访问某个特定文件。所以,Python做了应有的一切。

我预计它与Linux'最大打开文件数,因为已处理文件的数量非常接近该最大值。但这是巧合。

感谢您的帮助,并为噪音感到抱歉。

答案 1 :(得分:-1)

您的代码中肯定会发生其他事情。在重新打开文件之前检查文件对象的状态:

import os

files = os.listdir('/var/tmp/files')
fileClosed=True
for file in files:
    if fileClosed:
        with open('/var/tmp/files/{}'.format(file), 'r') as fd:
            content = fd.readlines()
        ## DO Stuff
    else:
        print "File not closed properly"
        break
    fileClosed = fd.closed

答案 2 :(得分:-1)

我不知道这是否能解决问题,但请试试。可能是程序在同一个变量中打开多个文件或循环阻止程序关闭文件。

import os

files = os.listdir('/var/tmp/files')
fd = list()

for file in files:
    if files > 100000:
        break
    fd.append(open('/var/tmp/files/{}'.format(file), 'r'))
    content = fd[file].readlines()

    # Doing stuff
for file in files:
    if files > 100000:
        break
    fd[files].close()

答案 3 :(得分:-1)

我认为你在你的"做东西"块。

。当您使用多进程时,可以假设您将始终遇到与文件描述符相关的问题,因此需要更多关注。

要解决此问题,请在开始其他过程之前不要打开文件。您应该在另一个进程启动后打开文件。