【发布时间】:2013-02-05 20:02:18
【问题描述】:
很简单,我在特定位置的所有子文件夹中循环,并从三个不同的文件中收集一些数字。
def GrepData():
import glob as glob
import os as os
os.chdir('RUNS')
RUNSDir = os.getcwd()
Directories = glob.glob('*.*')
ObjVal = []
ParVal = []
AADVal = []
for dir in Directories:
os.chdir(dir)
(X,Y) = dir.split(sep='+')
AADPath = glob.glob('Aad.out')
ObjPath = glob.glob('fobj.out')
ParPath = glob.glob('Par.out')
try:
with open(os.path.join(os.getcwd(),ObjPath[0])) as ObjFile:
for line in ObjFile:
ObjVal.append(list([X,Y,line.split()[0]]))
ObjFile.close()
except(IndexError):
ObjFile.close()
try:
with open(os.path.join(os.getcwd(),ParPath[0])) as ParFile:
for line in ParFile:
ParVal.append(list([X,Y,line.split()[0]]))
ParFile.close()
except(IndexError):
ParFile.close()
try:
with open(os.path.join(os.getcwd(),AADPath[0])) as AADFile:
for line in AADFile:
AADVal.append(list([X,Y,line.split()[0]]))
AADFile.close()
except(IndexError):
AADFile.close()
os.chdir(RUNSDir)
每个文件打开命令都放在 try - except 块中,因为在少数情况下打开的文件将为空,因此附加 line.split() 将导致索引错误,因为列表为空.
但是,当运行此脚本时,我收到以下错误:“OSError: [Errno 24] Too Many open files”
我的印象是“with open...”语句的想法是它负责在使用后关闭文件?显然,这并没有发生。
所以我要的是两件事:
- 回答:“我对 with open 的理解正确吗?”
- 如何纠正导致此问题的任何错误?
(是的,我知道代码并不完全优雅。整个尝试 - 除了应该是一个可重复使用的对象 - 但我会在找出这个错误后修复它)
【问题讨论】:
-
很好奇,既然您知道
with语句会关闭文件,为什么您在每种情况下都在之后自己显式关闭它? -
这也是我的想法。建议:删除
close调用并再次尝试运行代码。如果它继续显示相同的错误,我怀疑它应该,然后相应地更新您问题中的代码(即删除close()s)。否则,请编辑您的问题,说删除close调用可以解决问题,也许有人能够解释原因。 -
好吧 - 因为我收到了太多文件打开错误,显然不是。所以我补充说(曾经是通过),希望错误是由于导致文件保持打开状态的异常。
-
这里不是
open之一,它不会关闭文件,因为它们都在with语句中。我不明白这怎么可能......你能试着把它减少到我们也可以运行的东西吗?例如“用这三个文件创建 1000 个目录,然后像这样运行脚本”这样的指令。
标签: python file exception with-statement