Python操作系统错误:打开的文件太多

Python操作系统错误:打开的文件太多,python,windows-xp,python-2.7,Python,Windows Xp,Python 2.7,我正在Windows XP上使用Python 2.7 我的脚本依赖tempfile.mkstemp和tempfile.mkdtemp,以以下模式创建大量文件和目录: _,_tmp = mkstemp(prefix=section,dir=indir,text=True) <do something with file> os.close(_) 关于如何调试这个有什么想法吗?另外,如果您想了解更多信息,请告诉我。谢谢 编辑: 下面是一个使用示例: out = os.fdopen(

我正在Windows XP上使用Python 2.7

我的脚本依赖tempfile.mkstemp和tempfile.mkdtemp,以以下模式创建大量文件和目录:

_,_tmp = mkstemp(prefix=section,dir=indir,text=True)

<do something with file>

os.close(_)
关于如何调试这个有什么想法吗?另外,如果您想了解更多信息,请告诉我。谢谢

编辑:

下面是一个使用示例:

out = os.fdopen(_,'w')
out.write("Something")
out.close()

with open(_) as p:
    p.read()
为什么不使用
delete=False
?这允许您使用python文件对象,这是一个额外的好处。此外,它还可以用作上下文管理器(该管理器应负责确保文件正确关闭的所有详细信息):


调用
os.close()
时,存储在
中的值可能与创建临时文件时的值不同。尝试分配给命名变量,而不是


如果您能提供一个非常小的代码片段来演示错误,If将对您和我们有所帮助。

尝试一次打开更少的文件;可能在读取/写入某些数据之前打开它们,或者将信息存储在数量较少的文件中<代码>with
语句也可能有帮助。在关闭它们之前,我一次只打开一个(偶尔打开两个)。“对文件做点什么”基本上只是写入它…没有处理。每次打开文件时,我都使用
with
语句。为了进行调试,我添加了一个检查,以确保它们确实被关闭。可能是您使用名为
\uu
的变量有问题,因为它的值可能会被“”代码中的内容隐式更改。@martineau:如何隐式更改
\u
?仅写入和读取文件。您说“每次打开文件时都使用with语句”。您确实意识到当函数返回时,
mkstemp()
创建的文件已经打开了,也就是说,您不会再打开它了,是吗?为什么这会产生与仅调用mkstemp不同的效果?仅通过此修改运行解决了问题,虽然我仍然不明白为什么。使用这种方法是有效的,因为您最终使用的是
文件
对象而不是文件描述符(一个数字),文件描述符的管理封装在
NamedTemporaryFile
中,代码没有机会在该级别上弄乱任何东西,而
with
语句保证在退出时关闭并清理所有内容。我想得到一个小的代码片段,但这并不是那么容易,因为我不确定是哪一部分(或何时)导致了问题。输入是一个几千行的CSV文件。当我试图减少输入以发现问题时,错误不会发生。我提供的模式经常出现,但从来没有像我在文章中提到的那样对文件进行读/写操作。@DavidC当您更改为
\u文件时,它没有帮助,\u tmp=mkstemp(…)。。。关闭(_文件)
?我仍在处理代码,所以还不知道,但我不明白为什么这会改变任何东西。见马蒂诺对我的问题的评论。至少,对我来说,这可能是一种不好的做法。@DavidC这样做更具可读性和健壮性,但可能没有帮助。如果打印
的值会怎么样?在我的实验中,
mkstemp()。因为您一次只操作几个文件,所以您将排除文件描述符数量增加的情况(这表明调用
os.close
)会出现问题?在没有看到更多代码的情况下很难进行调试。:-)当我将其插入到“”的位置时,对原始帖子的编辑对我不起作用。在
out.close()
之后,无法在同一文件描述符上执行
os.fdopen(41;
out = os.fdopen(_,'w')
out.write("Something")
out.close()

with open(_) as p:
    p.read()
with tempfile.NamedTemporaryFile('w',prefix=section,dir=indir,delete=False) as f:
     pass #Do something with the file here.