我有一个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不关闭文件?
答案 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)
我认为你在你的"做东西"块。
。当您使用多进程时,可以假设您将始终遇到与文件描述符相关的问题,因此需要更多关注。要解决此问题,请在开始其他过程之前不要打开文件。您应该在另一个进程启动后打开文件。