Явный способ закрытия файла в Python

пожалуйста, посмотрите на следующий код:

for i in xrange(1,5000):
    with open(r'testtest%s.txt' % i, 'w') as qq:
        qq.write('aa'*3000)

похоже, что он написан в соответствии со всеми правилами Python; файлы закрываются после использования. Кажется. Но на самом деле он, кажется, рекомендует(!) система для закрытия файла, а не для его явного закрытия, потому что, когда я смотрю на монитор ресурсов, он показывает много открытых файлов . Это дает мне много проблем, потому что в моем скрипте я использую много файлов, и через долгое время я получил ошибку "слишком много открытых файлов", несмотря на "закрытие" его из источника код.

есть ли способ явно закрыть файл в Python? Или как я могу проверить, действительно ли файл был (! закрыто или нет?

обновление: Я только что попробовал с другим инструментом мониторинга-ручкой от Sysinternals, и он показывает все правильно, и я ему доверяю. Таким образом, это может быть проблема в самом Resource monitor.

скриншот, который показывает файлы, открытые:

Resource Monitor with the script running

2 ответов


код

for i in xrange(1, 5000):
    with open(r'test\test%s.txt' % i, 'w') as qq:
        qq.write('aa' * 3000)

семантически ровно эквивалентно

for i in xrange(1, 5000):
    qq = open(r'test\test%s.txt' % i, 'w')
    try:
        qq.write('aa' * 3000)
    finally:
        qq.close()

как использовать with with files-это способ убедиться, что файл закрыт сразу после with блок слева.

так что ваша проблема должна быть где-то еще.

возможно, версия используемой среды Python имеет ошибку, где fclose() не вызывается по какой-то причине.

но вы можете попробовать что-то вроде

try:
    qq.write('aa' * 3000)
finally:
    # qq.close()
    os.close(qq.fileno())

что делает системный вызов напрямую.


вы должны иметь возможность явно закрыть файл, вызвав qq.закрывать.)( Кроме того, python не закрывает файл сразу после его завершения, подобно тому, как он обрабатывает свою сборку мусора. Возможно, вам придется изучить, как заставить python освободить все неиспользуемые файловые дескрипторы. Если он похож на то, как он обрабатывает неиспользуемую переменную, он сообщит ОС, что он все еще использует их, независимо от того, используются ли они в настоящее время вашей программой.