Как хранить множество файловых дескрипторов, чтобы мы могли закрыть их на более позднем этапе - PullRequest
2 голосов
/ 28 марта 2012

Я написал небольшую программу на 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

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

Ответы [ 2 ]

3 голосов
/ 28 марта 2012

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

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

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

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

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


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

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

1 голос
/ 28 марта 2012

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

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

...