Проще говоря, я просматриваю все подпапки в определенном месте и собираю несколько чисел из трех разных файлов.
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, так как в некоторых случаях открываемый файл будет пустым, и, таким образом, добавление строки.split() приведет к ошибке индекса, поскольку список пуст.
Однако при запуске этого скрипта я получаю следующую ошибку: «OSError: [Errno 24] Too Many open files»
У меня сложилось впечатление, что идея оператора «с открытым ...» заключалась в том, что он позаботился о закрытии файла после использования? Ясно, что этого не происходит.
Итак, я прошу о двух вещах:
- Ответ на вопрос: "Правильно ли я понимаю слово open?"
- Как я могу исправить любую ошибку, вызывающую эту проблему?
(И да, я знаю, что код не совсем элегантный. Вся попытка, за исключением того, что это должен быть один объект, который повторно используется, но я исправлю это после выяснения этой ошибки)
with
закрывает файл, почему вы в каждом случае явно закрываете его самостоятельно после этого? - person Daniel Roseman   schedule 20.02.2013close
и попробуйте снова запустить код. Если он продолжает показывать ту же ошибку, как я подозреваю, то обновите код в своем вопросе соответствующим образом (т.е. удалитеclose()
s). В противном случае отредактируйте свой вопрос, сказав, что удаление вызововclose
устраняет проблему, и, возможно, кто-то сможет объяснить, почему. - person David Z   schedule 20.02.2013open
здесь, который оставляет файлы незакрытыми, так как все они находятся в операторахwith
. Я не понимаю, как это возможно... Можете ли вы попытаться уменьшить его до чего-то, что мы тоже можем запустить? Например, с такими инструкциями, как создать 1000 каталогов с этими тремя файлами и запустить скрипт таким образом. - person Armin Rigo   schedule 20.02.2013