簡単に言うと、特定の場所にあるすべてのサブフォルダーを循環し、3つの異なるファイルからいくつかの番号を収集しています。
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に配置されます。いくつかのケースでは、開かれるファイルが空になります。したがって、line.split()を追加すると、リストが空になるため、インデックスエラーが発生します。
ただし、このスクリプトを実行すると、次のエラーが発生します:「OSError:[Errno24]開いているファイルが多すぎます」
「withopen...」という言葉のアイデアは、使用後にファイルを閉じるのに注意を払うというものだという印象を受けました。明らかにそれは起こっていません。
だから私が求めているのは2つのことです:
- 答え:「オープンでの私の理解は正しいですか?」
- この問題を引き起こしているエラーを修正するにはどうすればよいですか?
(そして、はい、私はコードが正確にエレガントではないことを知っています。再利用される単一のオブジェクトであるべきを除いて、全体の試み-しかし、私はこのエラーを理解した後にそれを修正します)