Как сохранить много файловых дескрипторов, чтобы мы могли закрыть их на более позднем этапе

Я написал небольшую программу на python, где мне нужно открыть много файлов и закрыть их на более позднем этапе, я сохранил все дескрипторы файлов в списке, чтобы я мог обратиться к нему позже для закрытия.

В моей программе я храню все дескрипторы файлов (fout) в списке foutList[]

for cnt in range(count):
            fileName = "file" + `cnt` + ".txt"
            fullFileName = path + fileName
            print "opening file " + fullFileName
            try:
                    fout = open(fullFileName,"r")
                    foutList.append(fout)
            except IOError as e:
                    print "Cannot open file: %s" % e.strerror
                    break

Некоторые люди предлагали мне не хранить его в списке, но не объяснили причину. Может ли кто-нибудь объяснить, почему не рекомендуется хранить его в списке и каков другой возможный способ сделать то же самое?


person Gaara    schedule 28.03.2012    source источник
comment
возможно, вы могли бы создать функцию, которая вместо возврата foutList возвращает fout каждый раз, используя доходность python. например выход fout   -  person robert king    schedule 28.03.2012


Ответы (2)


Я не могу придумать никаких причин, почему это действительно зло, но возможные возражения против этого могут включать:

  1. Трудно гарантировать, что каждый дескриптор файла будет закрыт, когда вы закончите. Использование дескриптора файла с диспетчером контекста (см. синтаксис with open(filename) as file_handle:) всегда гарантирует, что дескриптор файла будет закрыт, даже если что-то пойдет не так.

  2. Держать открытыми множество файлов одновременно может быть невежливо, если вы собираетесь держать их открытыми в течение длительного времени, а другая программа пытается получить к ним доступ.

Это сказало: почему вы хотите держать целую кучу файлов открытыми для записи? Если вы время от времени записываете в кучу файлов, лучший способ сделать это — открыть файл, записать в него, а затем закрыть его, до тех пор, пока вы не будете готовы писать снова.

Все, что вам нужно сделать, это открыть файл в режиме добавленияopen(filename,'a'). Это позволяет вам записывать в конец существующего файла, не стирая то, что там уже есть (например, режим 'w').


Изменить(1) Я немного неправильно понял ваш вопрос - я думал, вы хотите открыть эти файлы для записи, а не для чтения. Не так уж плохо держать кучу файлов открытыми для чтения.

Если у вас есть открытые файлы, потому что вы хотите отслеживать файлы на наличие изменений, попробуйте использовать для вашей платформы аналог inotify в Linux, который сообщит вам, когда файл был изменен (без вам придется просмотреть его несколько раз.)

person Li-aung Yip    schedule 28.03.2012
comment
Спасибо за ответ. Что ж, я тестирую продукт, в котором мне приходится одновременно открывать много файлов и держать их открытыми некоторое время, прежде чем закрыть. Также у меня много раз запущена одна и та же программа для проверки процесса блокировки. Будет ли в этом случае служить with open(filename) as file_handle: ?? - person Gaara; 28.03.2012
comment
Возможно нет. Если вы действительно хотите открыть кучу файлов и держать их все открытыми, ваш подход в порядке. - person Li-aung Yip; 28.03.2012

Если вы их вообще не храните, они в конечном итоге будут удалены сборщиком мусора, что закроет их.

Если вы действительно хотите закрыть их вручную, используйте слабые ссылки для их хранения, что не помешает сборке мусора: http://docs.python.org/library/weakref.html

person Marcin    schedule 28.03.2012
comment
Спасибо за ответ, но опять же, в этом случае мне нужно хранить все слабые ссылки в списке или каком-то массиве, верно?? Поправьте меня, если я ошибаюсь. Ну, я закрываю все дескрипторы файлов в своей программе также на более позднем этапе, я просто хотел знать, хранит ли все дескрипторы файлов в списке плохая практика программирования? - person Gaara; 28.03.2012
comment
@Gaara Нет ничего плохого в том, чтобы хранить что-либо в списке. Вот для чего нужны списки. Вопрос только в том, является ли список подходящей структурой для данной ситуации. Вы не предоставили никакой информации, указывающей на то, что этот список неуместен. Меня больше всего беспокоит то, что, возможно, вам вообще не следует хранить дескрипторы файлов. - person Marcin; 28.03.2012
comment
Хорошо, я могу быть нубом, когда спрашиваю об этом, но если я не буду хранить дескрипторы файлов, то как я закрою открытые файлы? В моем случае я должен держать его открытым некоторое время, а затем закрыть. - person Gaara; 28.03.2012